我将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
调用期间都会显示这些警告。
expensiveTextProcessing
每次我在其中使用数据时,Spark都会执行所有操作df2
吗?
(有关更多上下文,您可以在这里看到我的实际Jupyter Notebook )
像RDD这样的DataFrame具有沿袭,该沿袭曾经用于在动作调用期间构建最终的DataFrame。当您致电计数时,所有执行程序的结果都将收集到驱动程序中。您可以检查Spark Web UI DAG表示形式和DataFrame的过渡以及进程的持续时间和本地化,以实现转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句