Если вы сохраните DataFrame на диск, загрузит ли Spark эти данные, если вы используете этот DataFrame ниже в сценарии? - PullRequest
2 голосов
/ 01 июля 2019

Если вы загрузите некоторые данные, вычислите DataFrame, запишите их на диск, а затем будете использовать DataFrame ... при условии, что они все еще не кэшируются в ОЗУ (допустим, их было недостаточно), Spark был бы достаточно умен. загружать данные с диска, а не пересчитывать DataFrame из исходных данных?

Например:

df1 = spark.read.parquet('data/df1.parquet')
df2 = spark.read.parquet('data/df2.parquet')

joined = df1.join(df2, df1.id == df2.id)
joined.write.parquet('data/joined.parquet')

computed = joined.select('id').withColummn('double_total', 2 * joined.total)
computed.write.parquet('data/computed.parquet')

При правильных обстоятельствах, когда мы сохраняем computed, будет ли он загружать joined DataFrame из data/joined.parquet или он всегда будет повторно вычисляться путем загрузки / присоединения df1 / df2, если это не так в данный момент кешируем joined?

1 Ответ

1 голос
/ 02 июля 2019

Кадр данных joined указывает на df1.join(df2, df1.id == df2.id).Насколько я знаю, средство записи паркета не вызовет каких-либо изменений в этой ссылке, поэтому для загрузки данных паркета необходимо создать новый считыватель Spark с spark.reader.parquet(...).

Вы можете проверить вышеупомянутое утверждение из кода DataFrameWriter (проверьте методы parquet / save), который возвращает Unit и не изменяет каким-либо образом ссылку на исходный фрейм данных.Наконец, чтобы ответить на ваш вопрос в приведенном выше примере, объединенный фрейм данных будет рассчитан один раз для joined.write.parquet('data/joined.parquet') и один раз для computed.write.parquet('data/computed.parquet')

...