【发布时间】:2017-02-01 16:11:23
【问题描述】:
我正在使用 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 期间会引发一些警告,并且这些警告会在 both 的 count 调用期间显示。
每次我使用df2 中的数据时,Spark 是否都会执行所有expensiveTextProcessing 操作?
(有关更多上下文,您可以查看我的实际 Jupyter Notebook here)
【问题讨论】:
-
您是否尝试过在任何时候持久化数据帧?如果没有,您为什么希望它更快?
-
嗯,如果我不使用
persist,那么所有为count所做的工作都会被丢弃?这是我不知何故错过的一个非常重要的一点...... -
我的意思是,
count()是一个动作,是的。转换是懒惰的。即使您没有修改数据框,计数仍然需要收集所有记录 -
有时数据存储在内存缓存中,但这不是您可以依赖的任何容量
标签: scala apache-spark