Python pyspark如果列具有相同的值,如何组合列值

Python pyspark如果列具有相同的值,如何组合列值,python,python-3.x,python-2.7,apache-spark,pyspark,Python,Python 3.x,Python 2.7,Apache Spark,Pyspark,我有一个想法,用同一个键组合不同行中的数据帧值(列表)。 组合必须在不同的行中具有相同或更多的值,因此我不能仅使用df.groupBy('id')来获得结果 以下是一个例子: +---------+--------------------+ |id |num_list | +---------+--------------------+ |apple |[11, 12] | |apple |[11, 13 ,14]

我有一个想法,用同一个键组合不同行中的数据帧值(列表)。 组合必须在不同的行中具有相同或更多的值,因此我不能仅使用
df.groupBy('id')
来获得结果

以下是一个例子:

+---------+--------------------+
|id       |num_list            |
+---------+--------------------+
|apple    |[11, 12]            |
|apple    |[11, 13 ,14]        |
|apple    |[10, 22, 25]        |
|banana   |[15, 26]            |
|banana   |[15, 29]            |
|banana   |[15, 27]            |
+---------+--------------------+
我们可以发现,
id=apple
有两条记录和两个列表,如:
[11,12],[11,13,14]
,因此它们将被组合成一个新记录
id=apple,num\u list=[11,12,13,14]

但是,
id=apple,num\u list=[10,22,25]
将不会被合并

这就是我想要的答案:

+---------+--------------------+
|id       |num_list            |
+---------+--------------------+
|apple    |[11, 12, 13, 14]    |
|apple    |[10, 22, 25]        |
|banana   |[15, 26, 27, 29]    |
+---------+--------------------+
编辑:

我必须解释一些规则

正如@Usernamenotfound所评论的

假设苹果有三个值
[11,12,14]
[9,13,14]
[12,13,27]
,答案将是
[9,11,12,13,14,27]
而不是
[9,11,12,13,14]
[12,13,27]

有一些新的例子:

+--------------------+------------+
|                  id|num_list    |
+--------------------+------------+
|apple               |         [0]|
|apple               |         [0]|
|apple               |         [1]|
|apple               |         [1]|
|apple               |         [2]|
|apple               |         [3]|
|apple               |         [4]|
|apple               |         [5]|
|apple               |         [6]|
|apple               |         [6]|
|apple               |         [7]|
|apple               |      [7, 8]|
|apple               |         [9]|
|apple               |         [9]|
|apple               |         [9]|
|apple               |     [9, 10]|
|apple               | [9, 17, 18]|
|apple               |        [10]|
|apple               |        [10]|
|apple               |        [10]|
+--------------------+------------+
如果我试一下@mayank的代码,就会得到错误的答案

+--------------------------------+---------------------------------------------------------------------------------------+
|                              id|num_list                                                                               |
+--------------------------------+---------------------------------------------------------------------------------------+
|apple                           |[0]                                                                                    |
|apple                           |[0]                                                                                    |
|apple                           |[1]                                                                                    |
|apple                           |[2]                                                                                    |
|apple                           |[3]                                                                                    |
|apple                           |[4]                                                                                    |
|apple                           |[5]                                                                                    |
|apple                           |[6]                                                                                    |
|apple                           |[8, 7]                                                                                 |
|apple                           |[9, 10, 11, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 36, 37, 38]|
|apple                           |[12]                                                                                   |
|apple                           |[14]                                                                                   |
|apple                           |[24]                                                                                   |
|apple                           |[31]                                                                                   |
|apple                           |[32]                                                                                   |
|apple                           |[33, 34]                                                                               |
|apple                           |[35]                                                                                   |
|apple                           |[39]                                                                                   |
+--------------------------------+---------------------------------------------------------------------------------------+

任何帮助都将不胜感激。

也许不是最有效的解决方案,但它解决了您的问题

import pyspark.sql.functions as F
from pyspark.sql.types import *

def get_combinations(lis):
   final = []

   for li in lis:
       if [y for y in final if [z for z in li if z in y]]:
           found = [y for y in final if [z for z in li if z in y]][0]
           to_add = list(set(found + li))
           final[final.index(found)] = to_add
       else:
           final.append(li)
   return final

apply_udf = F.udf(lambda x:get_combinations(x),ArrayType(ArrayType(IntegerType())))

df = df.groupby('id').agg(F.collect_list('num_list').alias('num_list'))\
        .select(['id', F.explode(apply_udf('num_list')).alias('num_list')])

您可以先分解,然后执行groupBy并收集集合。或者写一个自定义项。@Philantrovt如果我使用
分解
,然后
groupBy
[10,22,25]
组合在一起,结果不是我想要的答案。哦,明白了。对于相邻的行。是否只合并
num_list
中第一个列表项相同的项?@philantrover您有什么办法处理这种组合吗?我尝试了代码,但我不知道如果更改了不同的数据集,代码会得到错误的答案。我更新了上面的示例。谢谢如果我只通过num_list=[0]、[0]、[1]、[1]、[2]、[3]、[4]、[5]、[6]、[6]、[7]、[7,8]、[9]、[9]、[9,10]测试
get_组合
函数,它将得到错误的答案。我无法理解。您在上面的“编辑”中解释的内容适用于此代码。如果两个或多个列表至少有一个公共值,则它们将被合并为一个with set(这将导致删除重复的元素)。如果两个列表没有任何共同值,它们将成为两个单独的记录。行if any(y代表y在final if any中(z代表z在li中,如果z在y中))确保了这一点。对于上面提到的num_列表,您希望得到什么结果?好的,我得到了问题。any([0])返回False。我已经做了必要的修改。现在试试看。