【问题标题】:How to use Spark dataset GroupBy() [duplicate]如何使用 Spark 数据集 GroupBy() [重复]
【发布时间】:2018-09-17 03:39:53
【问题描述】:

我有一个带有架构的 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,它首先使用案例类将数据转换为数据集,然后上述方法将数据转换为 RDD 以便使用 groupBy()。将数据集转换为 RDD 可能会有一些开销。所以我想知道是否可以在不转换为 RDD 的情况下在数据集级别实现这一点?

非常感谢

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢。 "data.groupBy($"id").agg(max($"updated_dt") as "Max")" 只返回 max updated_dt,但我想用 max updated_dt 返回整个记录/行。
    • 链接中提到,由@user8371915发布
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多