Scala 使用groupBy的数据帧与使用reduceByKey的RDD

Scala 使用groupBy的数据帧与使用reduceByKey的RDD,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个csv文件:(customerId、orderId、Expense)。我使用两种方法计算每个客户的总支出: 方法1:使用数据帧和分组方式 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"

我有一个csv文件:(customerId、orderId、Expense)。我使用两种方法计算每个客户的总支出:

方法1:使用数据帧和分组方式

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个节点,即没有洗牌成本

这是我的spark会话配置

.master("local[*]") 
第二个问题:如何修改方法1以使用数据帧,同时保持方法2的良好性能


谢谢大家!

第一个代码扫描数据两次:

  • 一次到
    inferchema
  • 一次执行计数
如果没有任何进一步的信息,我会将执行较慢归因于这一事实。还有其他区别,比如计算执行计划的成本

特定的内存配置,包括堆外内存的大小,会进一步影响性能

如何修改方法1以使用DataFrame,同时保持与方法2类似的良好性能

read
方法提供架构参数

当我在笔记本电脑上运行时,它怎么会发生呢。i、 e.只有1个节点,即没有洗牌成本

由于本地通信,本地机器上的洗牌成本可能较低,但它仍然是一个完整的洗牌,包括磁盘IO,而且仍然很昂贵

这是因为方法1使用groupBy吗


没有。
groupBy
与此无关
Dataset.groupBy
不是RDD.groupBy(Key)

我已经读过了。但这里的要点是,我想使用DataFrame,而不是RDD,因为文档中提到的DataFrame具有更好的性能。此外,输入文件已经是结构化数据,使用DataFrame/Dataset是有意义的,对吗?