как я могу создать пару столбцов в отношении группы?

#apache-spark #pyspark #group-by #apache-spark-sql

#apache-spark #pyspark #группировка по #apache-spark-sql

Вопрос:

У меня есть фрейм данных и столбец как группа. id Для каждого id я хочу связать его элементы следующим образом:

 title     id
sal        1
summer     1
fada       1
row        2
winter     2
gole       2
jack       3
noway      3
 

вывод

 title     id     pair
sal        1      None
summer     1      summer,sal
fada       1      fada,summer
row        2      None
winter     2      winter, row
gole       2      gole,winter
jack       3      None
noway      3      noway,jack
 

Как вы можете видеть на выходе, мы соединяем последний элемент группы id с элементом над ним. Поскольку у первого элемента группы нет пары, которую я помещаю None . Я должен также упомянуть, что это можно сделать с pandas помощью следующего кода, но мне нужен Pyspark код, поскольку мои данные большие.

 df=data.assign(pair=data.groupby('id')['title'].apply(lambda x: x.str.cat(x.shift(1),sep=',')))

                    |
 

Ответ №1:

Я не могу больше подчеркивать, что Spark dataframe представляет собой неупорядоченный набор строк, поэтому выражение чего-то вроде «элемент над ним» не определено без столбца для упорядочения. Вы можете подделать порядок, используя F.monotonically_increasing_id() , но я не уверен, что это то, что вы хотели.

 from pyspark.sql import functions as F, Window

w = Window.partitionBy('id').orderBy(F.monotonically_increasing_id())

df2 = df.withColumn(
    'pair', 
    F.when(
        F.lag('title').over(w).isNotNull(),
        F.concat_ws(',', 'title', F.lag('title').over(w))
    )
)

df2.show()
 ------ --- ----------- 
| title| id|       pair|
 ------ --- ----------- 
|   sal|  1|       null|
|summer|  1| summer,sal|
|  fada|  1|fada,summer|
|  jack|  3|       null|
| noway|  3| noway,jack|
|   row|  2|       null|
|winter|  2| winter,row|
|  gole|  2|gole,winter|
 ------ --- ----------- 
 

Комментарии:

1. Я не могу воспроизвести ваше решение. Порядок строк в конечном результате неверен.

2. да, порядок строк отличается, потому что в вопросе не определен порядок. На самом деле это не очень хороший вопрос, но я просто пытаюсь помочь.

3. Почему PySpark нарушает порядок и почему вы используете этот monotonically_increasing_id метод?

4. Потому что в Spark dataframe нет встроенного порядка. Фреймы данных — это распределенные структуры данных без упорядочения, и они могут располагаться в любом порядке из-за случайного перемещения в оконных функциях.

5. Я использовал это, потому что мне нужен был порядок в lag функции, но в вопросе OP нет ничего, что можно было бы упорядочить.