如何在pyspark中合并连续的重复行

时间:2018-05-14 19:54:05

标签: python apache-spark pyspark apache-spark-sql

我有以下格式的数据框

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

我想通过查看col1中的连续重复项来合并col-2中的值。我们可以看到有两次出现连续重复的情况。它应该分别合并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 :(得分:1)

您需要一个用于定义DataFrame顺序的列。如果尚不存在,则可以使用pyspark.sql.functions.monotonically_increasing_id创建一个。

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

接下来,您可以使用this post中描述的技术为每组连续重复项创建细分:

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')