Apache spark 保存Spark数据帧';重播的逻辑计划或谱系

Apache spark 保存Spark数据帧';重播的逻辑计划或谱系,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,是否有办法保存或序列化Spark数据帧的逻辑计划并重播它。例如,查看以下计划: val df = spark.read.option("multiLine", true).json("/home/rtf.json").withColumn("double", col("ROW_ID") * 2) df.explain == Physical Plan == *Project [ROW_ID#0L, TEXT#1, (ROW_ID#0L * 2) AS double#5L] +- *FileSca

是否有办法保存或序列化Spark数据帧的逻辑计划并重播它。例如,查看以下计划:

val df = spark.read.option("multiLine", true).json("/home/rtf.json").withColumn("double", col("ROW_ID") * 2)
df.explain
== Physical Plan ==
*Project [ROW_ID#0L, TEXT#1, (ROW_ID#0L * 2) AS double#5L]
+- *FileScan json [ROW_ID#0L,TEXT#1] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/home/rtf.json], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<ROW_ID:bigint,TEXT:string>
df.count
res1: Long = 10

…生成具有相同逻辑计划的数据帧,但包含新行。

对-我想我正在寻找一种方法,将管道保存到一个文件中,以便稍后重新播放。好的,这在理论上是可能的-有
Dataset
构造函数接受逻辑计划,但API的这一部分是有意私有的。我不认为有任何保证可以保证plan是向前兼容的,如果你想把它当作一种持久性方法的话,这会带来严重的问题。也没有太多的实用价值——昂贵的部分发生在解决和优化计划时,而不是在逻辑层面。解析和优化只能在特定的上下文中进行,因此不能在
数据集之间移植。不如在Oracle中那么先进保存逻辑计划比保存生成此逻辑计划的spark代码有什么好处?例如,如果数据帧是从RDBMS创建的,应用了一些数据工程/转换(在ML管道之外),然后针对它训练Spark ML模型。然后能够从RDBMS源中获取实时数据并重播数据工程/转换步骤(无需复制代码),以便将实时数据传递到模型中进行预测,这将是非常有价值的。对-我想我正在寻找一种方法,将管道保存到一个文件中,以便稍后重播。嗯,这在理论上是可能的-存在接受逻辑计划的
Dataset
构造函数,但API的这一部分故意是私有的。我不认为有任何保证可以保证plan是向前兼容的,如果你想把它当作一种持久性方法的话,这会带来严重的问题。也没有太多的实用价值——昂贵的部分发生在解决和优化计划时,而不是在逻辑层面。解析和优化只能在特定的上下文中进行,因此不能在
数据集之间移植。不如在Oracle中那么先进保存逻辑计划比保存生成此逻辑计划的spark代码有什么好处?例如,如果数据帧是从RDBMS创建的,应用了一些数据工程/转换(在ML管道之外),然后针对它训练Spark ML模型。然后能够从RDBMS源获取实时数据并重播数据工程/转换步骤(无需复制代码),以便将实时数据传递到模型中进行预测,这将是非常有价值的。
val newDF = spark.plan.apply("path_to_saved_plan")
newDF.explain
    == Physical Plan ==
    *Project [ROW_ID#0L, TEXT#1, (ROW_ID#0L * 2) AS double#5L]
    +- *FileScan json [ROW_ID#0L,TEXT#1] Batched: false, Format: JSON, Location: InMemoryFileIndex[file:/home/rtf.json], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<ROW_ID:bigint,TEXT:string>
newDF.count
res2: Long = 11 // Increased!