我有一个包含一些应用程序使用数据的Spark DataFrame。 我的目标是从这个DataFrame收集某些指标,然后将它们累积在一起。
例如,我可能希望在此DataFrame中获取我的产品的总用户数:
df.select($"user").count.distinct
100500
然后我想在不同的应用程序版本中构建统计信息
df.groupBy("version").count.toJSON.show(false)
+-----------------------------------------+
|value |
+-----------------------------------------+
|{"version":"1.2.3.4","count":4051} |
|{"version":"1.2.3.5","count":1} |
|{"version":"1.2.4.6","count":1} |
|{"version":"2.0.0.1","count":30433} |
|{"version":"3.1.2.3","count":112195}|
|{"version":"3.1.0.4","count":11457} |
+-----------------------------------------+
然后我想在第二个DF中压缩记录,所以最后我需要有一个像这样的对象:
{ "totalUsers":100500, "versions":[
{"version":"1.2.3.4","count":4051},
{"version":"1.2.3.5","count":1},
{"version":"1.2.4.6","count":1},
{"version":"2.0.0.1","count":30433},
{"version":"3.1.2.3","count":112195},
{"version":"3.1.0.4","count":11457}] }
然后该对象将被写入另一个火花DF 。
实施此方法的正确方法是什么?
免责声明:我很新兴,所以如果我的问题太苛刻,我很抱歉。 我已经阅读了很多类似的问题,包括看似类似的问题,例如this和this。后者很接近,但仍然没有提供如何将多行累积到一个对象中的线索。我也无法从Apache Spark docs了解它。
答案 0 :(得分:0)
尝试使用collect_list功能,例如:
from pyspark.sql import functions as F
from pyspark.sql.functions import lit
totalUsers = 100500
agg = df.groupBy().agg(F.collect_list("value").alias('versions')).withColumn("totalUsers", lit(totalUsers)).show()
其中df
是具有聚合版本的数据框。我得到以下结果:
+--------------------+----------+
| versions|totalUsers|
+--------------------+----------+
|[{"version":"1.2....| 100500|
+--------------------+----------+
我的示例是用Python编写的,但我相信您可以使用与您的语言相同的方法。