似乎在缓存数据帧并将其保存为临时表时,行为在1.6和2.3之间发生了变化。在1.6中,以下代码一次执行printUDF
。 2.3中的等效代码(甚至相同)执行两次。
val rdd = context.parallelize(Seq(1, 2, 3)).map(Row(_))
val schema = StructType(StructField("num", IntegerType) :: Nil)
val df1 = sql.createDataFrame(rdd, schema)
df1.registerTempTable("data_table")
sql.udf.register("printUDF", (x:Int) => {print(x)
x
})
val df2 = sql.sql("select printUDF(num) result from data_table").cache()
df2.collect() //execute cache
df2.registerTempTable("cached_table")
val df3 = sql.sql("select result from cached_table")
df3.collect()
1.6打印123,而2.3打印123123,因此两次评估数据帧。
设法跳过临时表并直接从缓存的数据帧中进行选择来克服,但是想知道这是否是预期的行为/已知问题。
更新:根据https://issues.apache.org/jira/browse/SPARK-26510,这似乎是一个错误。