我有一个csv文件:(customerId,orderId,花费)。我计算使用两种方法每一位客户的总支出:DataBrame with groupBy与RDD with reduceByKey
方法1:使用数据帧和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?如果是这样,当我在笔记本电脑上运行时会发生什么。即只有1个节点,即没有洗牌成本?
这是我的火花会话配置
.master("local[*]")
第二个问题:我怎么能修改方法1使用数据帧,同时保留类似的方法2出色的表现?
谢谢!
我已阅读。但这里的重点是我想使用DataFrame,而不是RDD,因为提到的DataFrame文档具有更好的性能。此外,输入文件已经结构化的数据,这是有道理的使用数据帧/数据集,我是不是正确的? –