#apache-spark #pyspark #apache-spark-sql #numpy-ndarray
#apache-spark #pyspark #apache-spark-sql #numpy-ndarray
Вопрос:
Мой входной фрейм данных spark;
Client Feature1 Feature2
1 10 1
1 15 3
1 20 5
1 25 7
1 30 9
2 1 10
2 2 11
2 3 12
2 4 13
2 5 14
3 100 0
3 150 1
3 200 2
3 250 3
3 300 4
Я хочу преобразовать фрейм данных pyspark в матрицу 3d numpy для каждого клиента.
Я поделился желаемым результатом в соответствии с приведенными выше данными ;
[[[10, 1],
[15, 3],
[20, 5],
[25, 7],
[30, 9]],
[[1, 10],
[2, 11],
[3, 12],
[4, 13],
[5, 14]],
[[100, 0],
[150, 1],
[200, 2],
[250, 3],
[300, 4]]]
Не могли бы вы, пожалуйста, помочь мне в этом?
Ответ №1:
Вы можете выполнить collect_list
агрегацию перед сбором фрейма данных в Python и преобразованием результата в массив Numpy:
import numpy as np
import pyspark.sql.functions as F
a = np.array([
i[1] for i in
df.groupBy('Client')
.agg(F.collect_list(F.array(*df.columns[1:])))
.orderBy('Client')
.collect()
])
print(a)
array([[[ 10, 1],
[ 15, 3],
[ 20, 5],
[ 25, 7],
[ 30, 9]],
[[ 1, 10],
[ 2, 11],
[ 3, 12],
[ 4, 13],
[ 5, 14]],
[[100, 0],
[150, 1],
[200, 2],
[250, 3],
[300, 4]]])
Комментарии:
1. Эй, @mck, если функций слишком много, должен ли я писать их все по одному?
2. @Salih вы можете использовать
*df.columns[1:]
как в отредактированном ответе.