Эффективный способ чтения определенных столбцов из файла паркета в искре

Какой самый эффективный способ чтения только подмножества столбцов в искре из файла паркета, который имеет много столбцов? Использует spark.read.format("parquet").load(<parquet>).select(...col1, col2) лучший способ сделать это? Я также предпочел бы использовать типобезопасный набор данных с классами case для предварительного определения моей схемы, но не уверен.

4 ответа

Решение
val df = spark.read.parquet("fs://path/file.parquet").select(...)

Это будет читать только соответствующие столбцы. Действительно, паркет является столбчатым хранилищем, и он предназначен именно для этого типа использования. Попробуйте запустить df.explain и spark сообщит вам, что читаются только соответствующие столбцы (он печатает план выполнения). explain также сообщит вам, какие фильтры передаются в физический план выполнения, если вы также используете условие where. Наконец, используйте следующий код, чтобы преобразовать фрейм данных (набор данных строк) в набор данных вашего класса дел.

case class MyData...
val ds = df.as[MyData]

По крайней мере, в некоторых случаях получение кадра данных со всеми столбцами + выбор подмножества не сработает. Например, следующий код завершится ошибкой, если паркет содержит хотя бы одно поле с типом, не поддерживаемым Spark:

      spark.read.format("parquet").load("<path_to_file>").select("col1", "col2")

Одним из решений является предоставление схемы, содержащей только запрошенные столбцы, для load:

      spark.read.format("parquet").load("<path_to_file>",
                                   schema="col1 bigint, col2 float")

Используя это, вы сможете загрузить подмножество столбцов паркета, поддерживаемых Spark, даже если загрузка полного файла невозможна. Я использую здесь pyspark, но ожидаю, что версия Scala будет иметь что-то подобное.

Spark поддерживает опускание с паркетом так

load(<parquet>).select(...col1, col2)

Это хорошо.

Я также предпочел бы использовать типобезопасный набор данных с классами case для предварительного определения моей схемы, но не уверен.

Это может быть проблемой, так как некоторые оптимизации не работают в этом контексте. Набор данных Spark 2.0 против DataFrame

Паркет - это колоночный формат файла. Он предназначен именно для таких случаев использования.

val df = spark.read.parquet("<PATH_TO_FILE>").select(...)

должен сделать работу за вас.

Другие вопросы по тегам