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] |
+-------------------------+