Python pyspark:如果列在不同行中的值相等,则合并两行或多行

Python pyspark:如果列在不同行中的值相等,则合并两行或多行,python,python-3.x,python-2.7,pyspark,spark-graphx,Python,Python 3.x,Python 2.7,Pyspark,Spark Graphx,由于数据量大,我必须使用pyspark来组合不同行中的数据帧值(列表) 数据帧如下所示: x=sqlContext.createDataFrame([(“A”,“1”,“2”,“3]),(“B”,“4”,“2”,“5”,“6]),(“C”,“2”,“4”,“9”,“10]),(“D”,“11”,“12”,“15”,“16]),[“索引”,“数值组”) +-----+----------------+ |索引| num_组| +-----+----------------+ |A |[1,2,3]

由于数据量大,我必须使用
pyspark
来组合不同行中的数据帧值(列表)

数据帧如下所示:

x=sqlContext.createDataFrame([(“A”,“1”,“2”,“3]),(“B”,“4”,“2”,“5”,“6]),(“C”,“2”,“4”,“9”,“10]),(“D”,“11”,“12”,“15”,“16]),[“索引”,“数值组”)
+-----+----------------+
|索引| num_组|
+-----+----------------+
|A |[1,2,3]|
|B |[4,2,5,6]|
|C |[2,4,9,10]|
|D |[11,12,15,16]|
+-----+----------------+
我想通过列表合并
num_group
,这些列表具有如下相同的元素: (索引是无意义的值或字符串)

我想我可以使用GraphFrame找到连接,并基于不同行中的相等值合并两行或更多行

可能吗?我不太理解这个例子

任何帮助都将不胜感激。

您无需使用图书馆您所需要的只是
collect\u list
udf
explode
函数,这些函数在
pyspark.sql.functions
中提供,以及一些较小的python操作

因此,您要做的第一步是收集
num_group
列中的所有
列表

from pyspark.sql import functions as F
y = x.select(F.collect_list("num_group").alias("collected"))
这将为您提供
dataframe
as

+----------------------------------------------------------------------------------------------------------+
|collected                                                                                                 |
+----------------------------------------------------------------------------------------------------------+
|[WrappedArray(1, 2, 3), WrappedArray(4, 2, 5, 6), WrappedArray(2, 4, 9, 10), WrappedArray(11, 12, 15, 16)]|
+----------------------------------------------------------------------------------------------------------+
下一步是定义一个
udf
函数来迭代所有收集的列表,检查每个列表中的元素,并根据需要创建一个包含合并列表的新列表数组

def computation(s):
    finalList = []
    finalList.append(list(str(i) for i in s[0]))
    for index in range(1, len(s)):
        for finals in finalList:
            check = False
            for x in s[index]:
                if x in finals:
                    check = True
                    break
            if check == True:
                finals_1 = finals + list(str(i) for i in s[index])
                finalList.remove(finals)
                finalList.append(sorted(list(set(str(i) for i in finals_1))))
            else:
                finalList.append(list(str(i) for i in s[index]))
    return finalList

from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, StringType
collecting_udf = udf(computation, ArrayType(StringType()))
然后,您可以使用
分解
函数将最终列表分隔为单独的行

from pyspark.sql.functions import explode
y.select(explode(collecting_udf("collected")).alias("num_group"))
您应该具有以下输出

+-------------------------+
|num_group                |
+-------------------------+
|[1, 10, 2, 3, 4, 5, 6, 9]|
|[11, 12, 15, 16]         |
+-------------------------+

谢谢你的回复。几天前,我尝试了您自己提供的方法,但由于数据量大(100000000行),这种方法会被卡住。这就是为什么我必须找到另一种方法来解决这个问题!这个问题你有别的解决办法吗?
+-------------------------+
|num_group                |
+-------------------------+
|[1, 10, 2, 3, 4, 5, 6, 9]|
|[11, 12, 15, 16]         |
+-------------------------+