Фрейм данных Pyspark в матрицу 3d Numpy

#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:] как в отредактированном ответе.