Преобразование 2D матрицы - Dataframe в плоскую таблицу в PySpark - PullRequest
0 голосов
/ 25 октября 2018

У меня есть фрейм данных PySpark, который выглядит следующим образом:

  id  header1 header2 header3 ... headerN
  a      997    154.5   0.8        .... 
  b      0.3      3.4   6.7        ....
  c      7        8      9        ....
  .
  .
  .

Я хочу преобразовать это в плоскую таблицу, которая выглядит примерно так:

a header1 997
a header2 154.5
a header3 0.8
b header1 0.3
b header2 0.3

и т. Д.

Каждое имя столбца заголовка уникально.Имена первых столбцов являются идентификаторами.Как я могу наиболее эффективно преобразовать это в PySpark?Я могу перебрать DataFrame, но должен быть более эффективный способ.

Вот пример кадра данных:

df = spark.createDataFrame([
    ('a',997.0,154.5,0.8),
    ('b',0.3,3.4,6.7),
    ('c',7.0,8.0,9.0)],
    ['id','header1','header2','header3'])

1 Ответ

0 голосов
/ 25 октября 2018

Один подход -

Шаг первый : collect столбцы, кроме идентификатора, в столбец map с использованием функции create_map ;

Шаг второй : explode столбец карты;

from pyspark.sql.functions import create_map, lit, explode, col

map_cols = (c for x in df.columns if x != 'id' for c in [lit(x), col(x)])
df.select('id', explode(create_map(*map_cols))).show()
+---+-------+-----+
| id|    key|value|
+---+-------+-----+
|  a|header1|997.0|
|  a|header2|154.5|
|  a|header3|  0.8|
|  b|header1|  0.3|
|  b|header2|  3.4|
|  b|header3|  6.7|
|  c|header1|  7.0|
|  c|header2|  8.0|
|  c|header3|  9.0|
+---+-------+-----+
...