将spark DataFrame中的行收集到JSON对象中,然后将该对象放到另一个DF中

时间:2018-03-20 09:05:06

标签: apache-spark dataframe apache-spark-sql spark-dataframe

我有一个包含一些应用程序使用数据的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

实施此方法的正确方法是什么?

免责声明:我很新兴,所以如果我的问题太苛刻,我很抱歉。 我已经阅读了很多类似的问题,包括看似类似的问题,例如thisthis。后者很接近,但仍然没有提供如何将多行累积到一个对象中的线索。我也无法从Apache Spark docs了解它。

1 个答案:

答案 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编写的,但我相信您可以使用与您的语言相同的方法。