如何使用Spark数据集GroupBy()

时间:2018-04-07 05:22:01

标签: apache-spark group-by dataset apache-spark-sql rdd

我有一个带有架构的Hive表:

id             bigint
name           string
updated_dt     bigint

有许多记录具有相同的ID,但名称和updated_dt不同。对于每个id,我想返回最大的updated_dt记录(整行)。

我目前的做法是:

从Hive读取数据后,我可以使用case类将数据转换为RDD,然后使用groupBy()将具有相同id的所有记录组合在一起,然后选择具有最大updated_dt的记录。类似的东西:

 dataRdd.groupBy(_.id).map(x => x._2.toSeq.maxBy(_.updated_dt))

但是,由于我使用Spark 2.1,它首先使用case类将数据转换为数据集,然后上面的方法将数据转换为RDD以便使用groupBy()。可能有一些开销将数据集转换为RDD。所以我想知道我是否可以在数据集级别实现这一目标而不转换为RDD?

非常感谢

1 个答案:

答案 0 :(得分:1)

以下是使用Dataset

执行此操作的方法
data.groupBy($"id").agg(max($"updated_dt") as "Max") 

如果将其转换为RDD,则没有太多开销。如果您选择使用RDD,则可以使用.reduceByKey()而非使用.groupBy()进行更优化:

dataRdd.keyBy(_.id).reduceByKey((a,b) => if(a.updated_dt > b.updated_dt) a else b).values