Сохранять фактические расчетные значения в Spark - PullRequest
0 голосов
/ 16 ноября 2018

Я использую Spark со Scala.Я бы хотел, чтобы Spark сохранял кадры данных с вычисленными значениями, а не с логикой расчета.По сути, для данного фрейма данных df я ищу команду Spark или серию команд, эквивалентную следующей:

val schema = df.schema
val data = df.collect()
val newDf = sparkSession.createDataFrame(sparkSession.sqlContext.sparkContext.parallelize(data), schema)

newDf.persist()

В моем случае мне даны df1 и df2.Затем я должен итеративно создавать все новые и новые кадры данных на основе предыдущих.Код выглядит примерно так:

val metrics2 = doMetrics(df2)

val df3 = myCreationLogic(df1, df2, metrics2)
df3.persist()
val metrics3 = doMetrics(df3)

val df4 = myCreationLogic(df2, df3, metrics3)
df4.persist()
val metrics4 = doMetrics(df4)
...

Я не могу сгенерировать df3, df4 и т. Д. Одновременно.В metrics3 есть значения, которые будут определять точную логику создания df4.По сути, df4 является объединением df2 и df3, и для заполнения полей выполняются некоторые вычисления.Если вместо вызова df.persist() в приведенном выше коде я выполняю первый фрагмент кода для каждого нового кадра данных, моя производительность увеличивается более чем в 10 раз.

Насколько я понимаю, Spark пересчитывает представления, созданные на основе его таблицкаждый раз, когда мне нужно их использовать, даже если представления сохраняются (здесь я имею в виду «таблицы», когда я имею в виду кадры данных, которые были созданы на основе данных вне Spark, и «представления», означающие кадры данных, которые создаются путем выполнения Spark SQL надругие кадры данных).Это было бы полезно, если бы старые рамки данных могли потенциально измениться, и я хотел, чтобы новые отражали эти изменения.В нынешнем виде старые рамки данных не меняются, и мне нужно продолжать создавать новые на основе этих представлений.Я могу просто придерживаться опции вызова collect(), а затем каждый раз создавать новый фрейм данных, но я думаю, что должен быть лучший способ сделать это непосредственно в Spark.Я также надеюсь, что использование команд Spark ускорит процесс еще больше.

...