Pyspark: изменение формы без агрегирования - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу изменить свои данные с 4x3 до 2x2 в pyspark без агрегирования. Мой текущий вывод следующий:

columns = ['FAULTY', 'value_HIGH', 'count']
vals = [
    (1, 0, 141),
    (0, 0, 140),
    (1, 1, 21),
    (0, 1, 12)
]

Мне нужна таблица непредвиденных расходов со вторым столбцом в виде двух новых двоичных столбцов (value_HIGH_1, value_HIGH_0) и значениями из столбца count, что означает:

columns = ['FAULTY', 'value_HIGH_1', 'value_HIGH_0']
vals = [
    (1, 21, 141),
    (0, 12, 140)
]

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Использование groupby и pivot - это естественный способ сделать это , но если вы хотите избежать агрегирования, вы можете добиться этого с помощью filter и join

import pyspark.sql.functions as f

df.where("value_HIGH = 1").select("FAULTY", f.col("count").alias("value_HIGH_1"))\
    .join(
        df.where("value_HIGH = 0").select("FAULTY", f.col("count").alias("value_HIGH_1")),
        on="FAULTY"
    )\
    .show()
#+------+------------+------------+
#|FAULTY|value_HIGH_1|value_HIGH_1|
#+------+------------+------------+
#|     0|          12|         140|
#|     1|          21|         141|
#+------+------------+------------+
0 голосов
/ 01 ноября 2018

Вы можете использовать pivot с поддельной максимальной агрегацией (поскольку у вас есть только один элемент для каждой группы):

import pyspark.sql.functions as F
df.groupBy('FAULTY').pivot('value_HIGH').agg(F.max('count')).selectExpr(
    'FAULTY', '`1` as value_high_1', '`0` as value_high_0'
).show()
+------+------------+------------+
|FAULTY|value_high_1|value_high_0|
+------+------------+------------+
|     0|          12|         140|
|     1|          21|         141|
+------+------------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...