首页 > 解决方案 > 使用 group by 根据数据的两个不同子集获取两个聚合的不同计数

问题描述

考虑我有Dataset<Row>这样的

Day User    isInstall   isPlayed
1   U1      1           1
1   U2      1           0
1   U3      0           1
1   U4      1           0
1   U4      1           1
2   U6      1           1
2   U7      1           0
2   U8      0           1
2   U8      0           1
2   U7      1           0

我想对 Day 字段进行分组,并获取 isInstall 为 1 和 isPlayed 为 1 的唯一用户数。结果应该是这样的:

Day    isInstallUU    isPlayedUU
1      3              3
2      2              2

我能够为 isInstall 和 isPlayed 这样的计数获得不同的数据集,但我很困惑如何合并它们并获得一个数据集。

Dataset<Row> result1 = responseDataset.filter(col("isInstall").equalTo(1))
    .groupBy("Day").agg(countDistinct("User").alias("isInstallUU"));

Dataset<Row> result2 = responseDataset.filter(col("isPlayed").equalTo(1))
    .groupBy("Day").agg(countDistinct("User").alias("isPlayedUU"));

如何使用 java Spark API 实现这一点?

标签: javaapache-sparkapache-spark-sql

解决方案


首先,根据作者提供的条件过滤数据框。然后使用 group by 按“Day”列聚合,并附加两个代表用户不同计数的新列。检查以下代码:

    responseDataset.filter(col("isInstall").equalTo(1) && col("isPlayed").equalTo(1))
    .groupBy("Day")
    .agg(countDistinct("User").as("isInstallUU"), countDistinct("User").as("isPlayedUU"));

推荐阅读