【发布时间】:2020-01-27 17:07:28
【问题描述】:
在我的 Scala/Spark 应用程序中,我创建了 DataFrame。我计划在整个程序中多次使用这个 Dataframe。这就是为什么我决定对那个 DataFrame 使用.cache() 方法。正如您在循环中看到的那样,我使用不同的值多次过滤 DataFrame。出于某种原因,.count() 方法返回给我的结果总是相同的。实际上,它必须返回两个不同的计数值。另外,我注意到 Mesos 中的奇怪行为。感觉就像 .cache() 方法没有被执行。创建DataFrame后,程序会转到这部分代码if (!df.head(1).isEmpty),并执行了很长时间。我假设缓存进程会运行很长时间,其他进程会使用这个缓存并快速运行。你觉得问题出在哪里?
import org.apache.spark.sql.DataFrame
var df: DataFrame = spark
.read
.option("delimiter", "|")
.csv("/path_to_the_files/")
.filter(col("col5").isin("XXX", "YYY", "ZZZ"))
df.cache()
var array1 = Array("111", "222")
var array2 = Array("333")
var storage = Array(array1, array2)
if (!df.head(1).isEmpty) {
for (item <- storage) {
df.filter(
col("col1").isin(item:_*)
)
println("count: " + df.count())
}
}
【问题讨论】:
-
检查spark.apache.org/docs/latest/…: "你可以标记一个RDD使用persist()或cache()方法持久化。第一个在动作中计算的时间,它将保存在节点的内存中。 "
-
一个绝对可以加快工作速度的更改是将
isin替换为left join,因为您正在计算col1 上存在多少次存储项。虽然我不确定这是否适合您的情况。
标签: scala dataframe apache-spark mesos