Выполнение этого за один раз немного сложнее (но выполнимо с небольшим количеством работы), потому что вы вычисляете агрегации на двух разных подмножествах данных.
Самый простой выход - это вычислить два агрегации (как то, что вы пытались) и присоединиться к ним:
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"));
Dataset<Row> result = result1
.join(result2, result1.col("Day").equalTo(result1.col("Day")), "full_outer")
.na().fill(0);
Обратите внимание, что я использую полное внешнее объединение, потому что могут быть пользователи, которые не отображаются в двух подмножествах.Чтобы избежать нулевых значений, я заменяю их на 0.
EDIT :
Если вам интересно, есть способ сделать это за один этап.Идея состоит в том, чтобы создать 2 дополнительных пользовательских столбца, которые будут нулевыми, когда мы не хотим их агрегировать (искра игнорирует нулевые значения в countDistinct
).Это будет выглядеть так:
Dataset<Row> result = responseDataset
.withColumn("userI", when(col("isInstall").equalTo(1), col("user")))
.withColumn("userP", when(col("isPlayed").equalTo(1), col("user")))
.groupBy("day")
.agg(countDistinct(col("userP")).alias("isPlayedUU"),
countDistinct(col("userI")).alias("isInstallUU"));