Объединение PySpark и группировка по - PullRequest
0 голосов
/ 26 июня 2018

Я видел несколько сообщений, но агрегация выполняется по нескольким столбцам, но я хочу, чтобы агрегация основывалась на столбце OPTION_CD, основанном на следующем условии : Если к запросу к фрейму данных прикреплены условия, из-за которых возникает ошибка, у объекта DataFrame нет атрибута _get_object_id

IF NULL (STRING AGG (OPTION_CD, '' order by OPTION_CD), ''). Что я могу понять, так это то, что если OPTION_CD col равен нулю, тогда поместите пробел, добавьте OPTION_CD в одну строку, разделенную пробелом. Ниже приведен пример таблицы:

original CSV on which df is create

сначала происходит фильтрация, чтобы получить только 1 и 2 от COl 1, затем результат должен быть таким: enter image description here

Ниже приведен запрос, который я пишу на моем фрейме данных

df_result = df.filter((df.COL1 == 1)|(df.COL1 == 2)).select(df.COL1,df.COL2,(when(df.OPTION_CD == "NULL", " ").otherwise(df.groupBy(df.OPTION_CD))).agg( collect_list(df.OPTION_CD)))

Но не получить желаемых результатов. Кто-нибудь может помочь в этом? Я использую Pyspark.

1 Ответ

0 голосов
/ 26 июня 2018

Вы недостаточно четко сформулировали свой вопрос, но я постараюсь на него ответить.

Необходимо понимать, что столбец данных может иметь только один тип данных для всех строк. Если ваши начальные данные являются целыми числами, то вы не можете проверить равенство строк с пустой строкой, а с нулевым значением.

Также сбор списка возвращает массив целых чисел, поэтому вы не можете иметь [7, 5] в одной строке и "'" в другой строке. В любом случае это работает для вас?

from pyspark.sql.functions import col, collect_list

listOfTuples = [(1, 3, 1),(2, 3, 2),(1, 4, 5),(1, 4, 7),(5, 5, 8),(4, 1, 3),(2,4,None)]
df = spark.createDataFrame(listOfTuples , ["A", "B", "option"])
df.show()
>>>
+---+---+------+
|  A|  B|option|
+---+---+------+
|  1|  3|     1|
|  2|  3|     2|
|  1|  4|     5|
|  1|  4|     7|
|  5|  5|     8|
|  4|  1|     3|
|  2|  4|  null|
+---+---+------+


dfFinal = df.filter((df.A == 1)|(df.A == 2)).groupby(['A','B']).agg(collect_list(df['option']))
dfFinal.show()
>>>   
+---+---+--------------------+
|  A|  B|collect_list(option)|
+---+---+--------------------+
|  1|  3|                 [1]|
|  1|  4|              [5, 7]|
|  2|  3|                 [2]|
|  2|  4|                  []|
+---+---+--------------------+
...