我有一个例子:
val df = ... // read from HDFS / file / ...
println(df.count)
val newDf = df.select // Other transformations... Keep processing the original df.
我的问题是,如果我正在处理过程中计数,我是否需要缓存原始数据帧?我的意思是,我计算df,然后继续对其进行转换和处理。
.count 是否意味着df将被计算两次?
答案 0 :(得分:2)
在不了解您的用例和资源的情况下,很难给您一个确定的答案。但是,尽管Spark会两次访问源,但它很可能是负面的。
总体而言,有多个因素需要考虑:
Dataset
API缓存数据的成本非常高(这就是默认storage mode is MEMORY_AND_DISK
的原因),并且很容易超过加载数据的成本。所以...
.count是否意味着df将被计算两次?
在某种程度上取决于输入格式。纯文本格式(如JSON或CSV)比二进制源需要更多的重复工作。
我是否需要缓存原始数据帧
通常不会,除非您知道从存储中获取数据的成本证明了上面列出的缺点。
做出最终决定需要充分了解您的管道(主要是下游如何处理数据以及缓存如何影响数据流)和要优化的指标(延迟,总执行时间,运行所需资源的金钱成本)。 / p>
您还应该考虑替代count
,例如处理InputMetrics
或使用Accumulators
。