У меня есть данные, как показано ниже
-----------------------------
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
добавляет больше строк, размер данных значительно увеличился с 10 миллионов строк до 1,2 миллиарда и не в состоянии вычислить в надежное время на текущем кластере.
Я думаю, что лучше добавить больше столбцов, чем строк, а затем отключить их, но я понятия не имею, как этого добиться с помощью pyspark или spark SQL 2.2.1.