Как объединить последовательные повторяющиеся строки в pyspark - PullRequest
0 голосов
/ 14 мая 2018

У меня есть датафрейм в формате ниже

Col-1Col-2
a   d1
a   d2
x   d3
a   d4
f   d5
a   d6
a   d7

Я хочу объединить значения в столбце col-2, посмотрев на последовательные дубликаты в столбце coli. Мы можем видеть два появления последовательных дубликатов, поэтому. Следует объединить d1 + d2 и d6 + d7 по отдельности. Тип данных этих столбцов являются строками, d1 + d2 означает объединение строки d1 с d2

Окончательный результат должен быть таким, как показано ниже

Col-1Col-2
a   d1+d2
x   d3
a   d4
f   d5
a   d6+d7

1 Ответ

0 голосов
/ 15 мая 2018

Вам понадобится столбец, который определяет порядок вашего DataFrame.Если он еще не существует, вы можете создать его, используя pyspark.sql.functions.monotonically_increasing_id.

import pyspark.sql.functions as f
df = df.withColumn("id", f.monotonically_increasing_id())

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

import sys
import pyspark.sql.Window

globalWindow = Window.orderBy("id")
upToThisRowWindow = globalWindow.rowsBetween(-sys.maxsize-1, 0)

df = df.withColumn(
    "segment",
    f.sum(
        f.when(
            f.lag("Col-2", 1).over(globalWindow) != f.col("Col-2"),
            1
        ).otherwise(0)
    ).over(upToThisRowWindow)+1
)

Теперь вы можете группировать по сегментам и агрегировать, используя pyspark.sql.functions.collect_list для сбора значений в список и pyspark.sql.functions.concat() для объединения строк:

df = df.groupBy('segment').agg(f.concat(f.collect_list('Col-2'))).drop('segment')
...