#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 нет ничего, что можно было бы упорядочить.