这是我在一列上计算直方图的方式:
val df = spark.read.format("csv").option("header", "true").load("/project/test.csv")
df.map(row => row.getString(2).toDouble).rdd.histogram(10)
我想计算所有列的直方图。我可以简单地重复第二行(请参见上面的代码),并在每列上分别调用直方图。但是我担心的是,每次我调用histogram()时,Spark都会从磁盘加载数据,这意味着如果有10列,则数据将加载10次。有没有更有效的方法可以做到这一点?如何一次拍摄所有10列的直方图?
修改
这是将多个histogram()调用组合成一个表达式的一种方法:
val histograms = {
val a = df.map(row => row.getString(0).toDouble).rdd.histogram(10)
val b = df.map(row => row.getString(1).toDouble).rdd.histogram(15)
(a, b)
}
这是否保证直方图只需对数据进行一次遍历即可计算出来?将多个直方图调用组合成一个表达式是技巧吗?还是有必要吗?即使在使用单独的语句的情况下,也不会在使用结果之前触发延迟评估吗?