当某些值为null时,如何将DataFrame中的多个列连接到另一列?

时间:2016-09-08 15:34:45

标签: pyspark spark-dataframe

def column_concat(a,b): return concat(a,b)
searches_df = searches_df.withColumn('unique_id',reduce(column_concat,(searches_df[col] for col in search_parameters)))

除非列包含空值,否则整个连接字符串为空。我喜欢占位符或某个字符而不是串联字符串。

4 个答案:

答案 0 :(得分:7)

鉴于以下数据框:

one()

一种解决方案是使用udf来过滤/替换空值,例如:

df = sqlContext.createDataFrame([("foo", "bar"), ("baz", None)], 
                                ('a', 'b'))
df.show()

+---+----+
|  a|   b|
+---+----+
|foo| bar|
|baz|null|
+---+----+

产生:

import pyspark.sql.functions as F
from pyspark.sql.types import StringType

concat_udf = F.udf(lambda cols: "".join([x if x is not None else "*" for x in cols]), StringType())
df.withColumn("unique_id", concat_udf(F.array("a", "b"))).show()

可替换地:

+---+----+---------+
|  a|   b|unique_id|
+---+----+---------+
|foo| bar|   foobar|
|baz|null|     baz*|
+---+----+---------+

也产生:

import pyspark.sql.functions as F

def myConcat(*cols):
    return F.concat(*[F.coalesce(c, F.lit("*")) for c in cols])

df.withColumn("unique_id", myConcat("a", "b")).show()

答案 1 :(得分:1)

首先需要如下导入pyspark sql函数

from pyspark.sql import functions as sf
df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))

答案 2 :(得分:0)

df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))

答案 3 :(得分:0)

在Spark Scala中,您可以先用NA填充这些列的空值(一个可以取任何值),然后执行串联操作。效果很好。

df = df.na.fill("NA").concat(col A, col B, col C, col D, col E)