串联数组pyspark

时间:2019-11-15 10:55:12

标签: pyspark apache-spark-sql

我有一个pyspark Dataframe spark版本<2.4

示例数据框:

to combine the 3 columns column_1, column_2 and column_3 in one "join_columns" and to drop the duplicates values.

我想要df.withColumn("join_columns", concat(df.s, df.d)).drop_duplicates() 我使用了concat,它组合了3列,但是仅当我在该列中只有一个值时才使用,因为可能是“ concat”仅在字符串上起作用

{{1}}

如何合并数组列的值? 谢谢

3 个答案:

答案 0 :(得分:1)

您能否尝试使用下面的解决方案,火花2.4

import pyspark.sql.functions as F

df = df.withColumn('col12', F.array_union(df.column_1, df.column_2))
df = df.withColumn('join_columns_dup', F.array_union(df.col12, df.column_3))
df = df.withColumn('join_columns', F.array_distinct(df.join_columns_dup))

使用Spark <2.4,您可以使用

def array_concat(c1, c2, c3):
    return list(set((list() if c1 is None else c1) + (list() if c2 is None else c2) + (list() if c3 is None else c3)))

arrayConcatUdf = F.udf(array_concat, Types.ArrayType(Types.StringType()))
df = df.withColumn('join_columns', arrayConcatUdf(df.c1, df.c2, df.c3))

Crud,但也可以使用null值

答案 1 :(得分:1)

在Spark 2.4中,您可以组合这三列,然后使用flatten函数:

df.withColumn("join_columns", flatten(array("column1", "column2", "column2")))

在较早的spark版本中,您可以使UDF展平:

from pyspark.sql.functions import udf

flatten = udf(lambda arr: str(arr).replace("[", "").replace("]", "").split(","), ArrayType())
df.withColumn("join_columns", flatten(array("column1", "column2", "column2")))

答案 2 :(得分:1)

在Spark 2.4之前,您可以使用udf:

from pyspark.sql.functions import udf

@udf('array<string>')
def array_union(*arr):
    return list(set([e.lstrip('0').zfill(5) for a in arr if isinstance(a, list) for e in a]))

df.withColumn('join_columns', array_union('column_1','column_2','column_3')).show(truncate=False)

注意::我们使用e.lstrip('0').zfill(5),因此对于每个数组项,我们先删除前导0,然后将0填充到左侧,如果长度的字符串小于5。