我有一个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}}
如何合并数组列的值? 谢谢
答案 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。