Python Pypsark函数,用于连接不同列的唯一值

Python Pypsark函数,用于连接不同列的唯一值,python,pyspark,pyspark-dataframes,Python,Pyspark,Pyspark Dataframes,编辑 下面只是df的一个例子,我需要一个可扩展的解决方案。实际df有30多个列(p1、p2、p3等) 我有一个像这样的df- +---+---+----+ | id| p1| p2 | +---+---+------ |foo|[1]| null| |bar|[2]| [2] | |loo|[3]| [4] | +---+---+-----+ +---+---+----+--------+ | id| p1| p2 | concat | +---+---+------+------+ |foo

编辑 下面只是df的一个例子,我需要一个可扩展的解决方案。实际df有30多个列(p1、p2、p3等)

我有一个像这样的df-

+---+---+----+
| id| p1| p2 |
+---+---+------
|foo|[1]| null|
|bar|[2]| [2] |
|loo|[3]| [4] |
+---+---+-----+
+---+---+----+--------+
| id| p1| p2 | concat |
+---+---+------+------+
|foo|[1]| null|  [1]  |
|bar|[2]| [2] |  [2]  |
|loo|[3]| [4] |  [3,4]|
+---+---+-----+--------
我想要这样的输出-

+---+---+----+
| id| p1| p2 |
+---+---+------
|foo|[1]| null|
|bar|[2]| [2] |
|loo|[3]| [4] |
+---+---+-----+
+---+---+----+--------+
| id| p1| p2 | concat |
+---+---+------+------+
|foo|[1]| null|  [1]  |
|bar|[2]| [2] |  [2]  |
|loo|[3]| [4] |  [3,4]|
+---+---+-----+--------
因此,新列concat将只保存来自p1和p2列的唯一值 我在pyspark中尝试了F.concat()方法,但它没有给出预期的结果。 感谢您的帮助


感谢您对concat值的关注。如果存在唯一值,您可以使用以下代码。我使用lambda函数分析所有数据帧行,并声明check_unique_vlaues(),它为分析的行返回uniques值

def check_unique_vlaues(first, second):
    if first == second:
        return first
    else:
        return [first, second]

df['p3'] = df.apply(lambda x: check_unique_vlaues(x.p1, x.p2), axis=1)
编辑:

要从一行中的所有列中获取唯一值,而无需先获取唯一值,我们可以使用熊猫系列可用的
unique()
函数

def func(row):
    row = row[1:]
    return row.unique()

df['concat'] = df.apply(lambda x: func(x), axis=1)

如果您有Spark 2.4,则可以使用
数组
函数+

df.withColumn("concat", F.array_union(df.p1, df.p2))\
    .withColumn("concat", F.array_distinct(df.concat)).show()
对于Spark 2.3及以下版本

from pyspark.sql import functions as F

def concat_array(col1, col2):
     return list(set((list() if col1 is None else col1) + (list() if col2 is None else col2)))

concat_array_udf = F.udf(concat_array, ArrayType(IntegerType()))

df.withColumn('concat', concat_array_udf(df.p1, df.p2)).show()
+---+---+----+------+
| id| p1|  p2|concat|
+---+---+----+------+
|foo|[1]|null|   [1]|
|bar|[2]| [2]|   [2]|
|loo|[3]| [4]|[3, 4]|
+---+---+----+------+

谢谢,但是这一个对我来说很难扩展,上面发布的df只是一个例子,在现实中,我有30多个列需要比较,并且只从itOK返回唯一的值,我理解,我将尝试改进代码,然后,我将编辑答案。编辑后请检查我的答案,如果它是工作,请给我反馈,因为你不为我工作。为了实现上述功能,我不得不将pyspark数据帧更改为pandas。转换失败,因为我正在处理的行数是5亿+array_union只接受2个array作为输入,我在最初的问题中遗漏了细节。解决方案需要具有可扩展性。实际上我有30多列(p1,p2,p3,…)你的spark版本是什么?