我有一个 csv 文件:(customerId,orderId,花)。我使用两种方法计算每个客户的总支出:
方法 1:使用 DataFrame 和 groupBy
val df = ss.read
.option("header", false)
.option("inferSchema", true)
.csv("data.csv")
df
.groupBy("_c0")
.sum("_c2")
.collect()
方法 2:使用 RDD 和 reduceByKey
sc
.textFile("data.csv")
.map(parseLine)
.reduceByKey(_ + _)
.collect()
private def parseLine(line: String) = {
val fields = line.split(",")
(fields(0).toInt, fields(2).toFloat)
}
两种方法的结果相同。但是,方法 2 总是比方法 1 快(2 倍)。
第一个问题:这是因为方法 1 正在使用 groupBy 吗?如果是这样,当我在笔记本电脑上运行时怎么办? i.e。只有 1 个节点 i.e。有没有洗牌费用?
这是我的火花会话的配置
.master("local[*]")
第二个问题:如何在保留方法 2 的良好性能的同时修改方法 1 以使用 DataFrame?
谢谢!
1 回答
您的第一个代码两次扫描数据:
一次到
inferchema
。一旦执行计数。
如果没有更多的信息,我会认为执行速度较慢是因为这一事实。还有其他差异,例如计算执行计划的成本。
特定的内存配置,包括 off-heap 内存的大小,可能会进一步影响性能。
提供
read
方法的架构参数。由于进行本地通信,本地计算机上的随机播放成本可能会更低,但是它仍然是包括磁盘 IO 在内的完全随机播放,而且仍然很昂贵。
不。
groupBy
与它无关。Dataset.groupBy
不是RDD.groupBy(Key)
。