Эффективный способ чтения определенных столбцов из файла паркета в искре
Какой самый эффективный способ чтения только подмножества столбцов в искре из файла паркета, который имеет много столбцов? Использует 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(...)
должен сделать работу за вас.