2

我正在使用 spark 2.0 从 parquet 文件中读取数据。

 val Df = sqlContext.read.parquet("c:/data/parquet1")
 val dfSelect= Df.
      select(
        "id",
        "Currency",
        "balance"

      )



val dfSumForeachId=dfSelect.groupBy("id").sum("balance")
val total=dfSumForeachId.agg(sum("sum(balance)")).first().getDouble(0)

为了获得总余额值,这是在数据帧上使用操作 first() 获得它的最佳方法吗?

在 spark 2.0 中使用 groupby key 是否可以,它是否具有与 rdd 上的 groupbykey 相同的性能问题,是否需要通过网络对整个数据进行洗牌,然后执行聚合,或者聚合在本地执行,如早期版本的 reducebykey火花

谢谢

4

1 回答 1

3

首先使用来获取数据是一种完全有效的获取数据的方式。也就是说,做:

val total = dfSelect.agg(sum("balance")).first().getDouble(0)

可能会给你更好的性能来获得总数。

由于相同的原因,group by key 和 reduce by key 的工作方式与以前的版本完全相同。group by key 不对您想要执行的操作做出任何假设,因此无法像 reduce by key 那样知道如何进行部分聚合。

当您执行 dataframe groupby 和 sum 时,您实际上是使用 + 选项通过键进行减少,而您所做的第二个聚合是使用 + 进行减少。也就是说,dataframe 做得更有效,因为确切地知道做了什么,它可以执行许多优化,例如整个阶段的代码生成。

于 2017-01-03T11:07:16.893 回答