Python Pypsark函数,用于连接不同列的唯一值
编辑 下面只是df的一个例子,我需要一个可扩展的解决方案。实际df有30多个列(p1、p2、p3等) 我有一个像这样的df-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
+---+---+----+
| 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版本是什么?