【发布时间】:2019-02-27 19:51:43
【问题描述】:
我有一个带有数组列的数据框。
val json = """[
{"id": 1, "value": [11, 12, 18]},
{"id": 2, "value": [23, 21, 29]}
]"""
val df = spark.read.json(Seq(json).toDS)
scala> df.show
+---+------------+
| id| value|
+---+------------+
| 1|[11, 12, 18]|
| 2|[23, 21, 29]|
+---+------------+
现在我需要对值列应用不同的聚合函数。
我可以打电话给explode和groupBy,例如
df.select($"id", explode($"value").as("value")).groupBy($"id").agg(max("value"), avg("value")).show
+---+----------+------------------+
| id|max(value)| avg(value)|
+---+----------+------------------+
| 1| 18|13.666666666666666|
| 2| 29|24.333333333333332|
+---+----------+------------------+
这里让我困扰的是,我将我的 DataFrame 分解为一个更大的,然后将其缩减为原始调用 groupBy。
有没有更好(即更有效)的方法来调用数组列上的聚合函数?可能我可以实现 UDF,但我不想自己实现所有聚合 UDF。
编辑。有人引用了this SO question,但在我的情况下它不起作用。
size 工作正常
scala> df.select($"id", size($"value")).show
+---+-----------+
| id|size(value)|
+---+-----------+
| 1| 3|
| 2| 3|
+---+-----------+
但是avg 或max 不起作用。
【问题讨论】:
标签: scala apache-spark apache-spark-sql aggregate-functions