我正在使用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 表示和数据帧的暂存,以及进程的持续时间和本地化,以便实现转换。