Pypsark函数连接不同列的唯一值

时间:2020-10-06 20:16:48

标签: 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|[1]| null|  [1]  |
|bar|[2]| [2] |  [2]  |
|loo|[3]| [4] |  [3,4]|
+---+---+-----+--------

因此,新列concat将仅保存p1和p2列中的唯一值 我已经在pyspark中尝试了F.concat()方法,但是没有给出期望的结果。 任何帮助表示赞赏。

谢谢

2 个答案:

答案 0 :(得分:0)

如果要确定值的唯一性,请使用以下代码。我使用了lambda函数来分析所有DataFrame行,并声明check_unique_vlaues(),它返回所分析行的唯一值。

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()函数,该函数可用于pandas系列。

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

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

答案 1 :(得分:0)

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

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