首页 文章

带有 groupBy 的 DataFrame 与带有 reduceByKey 的 RDD

提问于
浏览
2

我有一个 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 回答

  • 1

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

    • 一次到inferchema

    • 一旦执行计数。

    如果没有更多的信息,我会认为执行速度较慢是因为这一事实。还有其他差异,例如计算执行计划的成本。

    特定的内存配置,包括 off-heap 内存的大小,可能会进一步影响性能。

    如何在保留方法 2 的良好性能的同时修改方法 1 以使用 DataFrame?

    提供read方法的架构参数。

    当我在笔记本电脑上运行时怎么办? i.e。只有 1 个节点 i.e。有没有洗牌费用?

    由于进行本地通信,本地计算机上的随机播放成本可能会更低,但是它仍然是包括磁盘 IO 在内的完全随机播放,而且仍然很昂贵。

    这是因为方法 1 正在使用 groupBy

    不。groupBy与它无关。 Dataset.groupBy不是RDD.groupBy(Key)

相关问题