Создание таблицы сложного Pyspark с использованием Array, Pivot - PullRequest
0 голосов
/ 26 июня 2019

У меня есть таблица в следующем формате

+-------+--------+
|Column1|Column2 |
+-------+--------+
|[A, 1] |X       |
|[A, 1] |Y       |
|[B, 2] |Y       |
|[B, 2] |Z       |
|[C, 1] |X       |
|[C, 1] |Z       |
+-------+--------+

Мне нужна таблица со следующим результатом:

+-------+-------+-------+-------+
|       |[A, 1] |[B, 2] |[C, 1] |
+-------+-------+-------+-------+
|[A, 1] |[X, Y] |[Y]    |[X]    |
|[B, 2] |[Y]    |[Y, Z] |[Z]    |
|[C, 1] |[X]    |[Z]    |[X, Z] |
+-------+-------+-------+-------+

Или еще лучше будет такой результат:

+-------+-------+-------+-------+
|       |[A, 1] |[B, 2] |[C, 1] |
+-------+-------+-------+-------+
|[A, 1] |2      |1      |1      |
|[B, 2] |1      |2      |1      |
|[C, 1] |1      |1      |2      |
+-------+-------+-------+-------+

1 Ответ

2 голосов
/ 26 июня 2019

Это будет дорого, особенно для больших данных, но вы можете сделать join + pivot:

from pyspark.sql.functions import count

df.alias("l").join(df.alias("r"), on="Column2")\
    .select("l.Column1", "r.Column1")\
    .groupBy("l.Column1")\
    .pivot("r.Column1")\
    .agg(count("r.Column1"))\
    .show()
#+-------+------+------+------+
#|Column1|[A, 1]|[B, 2]|[C, 1]|
#+-------+------+------+------+
#| [A, 1]|     2|     1|     1|
#| [B, 2]|     1|     2|     1|
#| [C, 1]|     1|     1|     2|
#+-------+------+------+------+
...