【发布时间】:2019-06-21 00:20:17
【问题描述】:
我有如下数据
-----------------------------
place | key | weights
----------------------------
amazon | lion | [ 34, 23, 56 ]
north | bear | [ 90, 45]
amazon | lion | [ 38, 30, 50 ]
amazon | bear | [ 45 ]
amazon | bear | [ 40 ]
我试图得到如下结果
-----------------------------
place | key | average
----------------------------
amazon | lion1 | 36.0 #(34 + 38)/2
amazon | lion2 | 26.5 #(23 + 30)/2
amazon | lion3 | 53.0 #(50 + 56)/2
north | bear1 | 90 #(90)/1
north | bear2 | 45 #(45)/1
amazon | bear1 | 42.5 #(45 + 40)/2
我明白了,首先我必须对列 place 和 key 进行分组,然后我必须根据索引对数组元素取平均值。
例如,lion1 是数组 [ 34, 23, 56 ] 和 [ 38, 30, 50 ] 中的第一个索引元素。
我已经有一个使用posexplode的解决方案,但问题是在实际数据中weights数组列大小非常高,因为posexplode增加了更多行,数据大小从1000万行大幅增加到12亿行并且无法在当前集群上以可靠的时间进行计算。
我认为添加比行更多的列然后取消透视列更好,但我不知道如何使用 pyspark 或 spark SQL 2.2.1 来实现。
【问题讨论】:
标签: apache-spark hive pyspark apache-spark-sql pyspark-sql