Ленивая загрузка разделенного паркета в Apache Spark - PullRequest
2 голосов
/ 30 октября 2019

Насколько я понимаю, Apache Spark использует ленивую оценку. Так, например, код, подобный следующему, который состоит только из преобразований, не будет выполнять фактическую обработку:

val transformed_df = df.filter("some_field = 10").select("some_other_field", "yet_another_field")

Только когда мы выполняем «действие», любая обработка будет фактически выполняться:

transformed_df.show()

У меня сложилось впечатление, что операции загрузки также ленивы в искре. (См. Как Spark загружает данные в память .)

Однако мой опыт работы со свечой не подтвердил это. Когда я делаю что-то вроде следующего, выполнение

val df = spark.read.parquet("/path/to/parquet/")

, кажется, сильно зависит от размера данных в пути. Другими словами, это не строго ленивый. Это неудобно, если данные разбиты на разделы, и мне нужно только посмотреть на долю разделов.

Например:

df.filter("partitioned_field = 10").show()

Если данные разбиты в хранилище на «partitioned_field», Я бы ожидал, что spark подождет, пока не будет вызван show (), а затем прочитает только данные в "/ path / to / parquet / partitioned_field = 10 /". Но, опять же, это не так. Spark, по-видимому, выполняет по крайней мере некоторые операции со всеми данными, как только вызывается чтение или загрузка.

Я мог бы обойти это, только загрузив /path/to/parquet/partitioned_field=10/, но это гораздо менее элегантночем просто вызвать «чтение» и фильтрацию по разделенному полю, и это сложнее обобщить.

Есть ли более элегантный предпочтительный способ ленивой загрузки разделов данных паркета?

(Для пояснения, я использую Spark 2.4.3)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...