Spark 重复“数据帧”处理工作



我正在使用Apache Spark(1.6)进行ML任务,我注意到Spark似乎在单个DataFrame上重复处理。

我的代码看起来像这样:

val df1 = sqlContext.read.parquet("data.parquet")
val df2 = df1.withColumn("new", explode(expensiveTextProcessing($"text"))
println(df2.count)
... (no changes to df2)
println(df2.count)

所以我知道我的withColumn是一种转变,count是一种行动,所以count看起来会像更长的操作。

但是,我注意到我第二次运行df2.count所需的时间与第一次df2.count一样长。此外,我正在使用的 NLP 工具在expensiveTextProcessing期间抛出了一些警告,这些警告在两次count调用期间都会显示。

每次我在df2中使用数据时,Spark 是否都会执行所有expensiveTextProcessing

(有关更多上下文,您可以在此处查看我的实际Jupyter Notebook)

像RDD这样的数据帧具有世系,用于在操作调用期间构建生成的DataFrame。调用计数时,所有执行程序的结果将收集到驱动程序。可以检查 Spark Web UI DAG 表示和数据帧的暂存,以及进程的持续时间和本地化,以便实现转换。