是否有任何性能问题迫使在 spark 中使用计数进行急切评估?

soo*_*ote 4 apache-spark

通常我Dataset.count在 3 个场景中看到整个代码库:

  1. 日志记录 log.info("this ds has ${dataset.count} rows")
  2. 分枝 if (dataset.count > 0) do x else do y
  3. 强制缓存 dataset.persist.count

它是否会通过强制查询优化器在任何这些场景中过早地急切来阻止查询优化器创建最有效的 dag?

hi-*_*zir 5

TL;DR 1) 和 2) 通常可以避免但不应该伤害您(忽略评估成本),3) 通常是有害的Cargo 崇拜编程实践。

没有 cache

count单独打电话大多是浪费。虽然并不总是很简单,但日志记录可以用从侦听器检索到的信息替换(这里是 RDD 的示例),并且控制流需求通常(不总是)可以通过更好的管道设计来调节。

单独它不会对执行计划产生任何影响(计数的执行计划,无论如何通常与父级的执行计划不同。通常Spark尽可能少做工作,因此它会删除执行计划的一部分,这不需要计算计数)。

cache

countcache是不好的做法,从RDD API使用的模式复制天真。它已经有争议了RDDs,但是 withDataFrame可以破坏很多内部优化(选择和谓词下推),从技术上讲,甚至不能保证工作