我有一个带有架构的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?
非常感谢
答案 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