pyspark.sql.functions两中字符串拼接函数的用法和差异
concat_ws(sep, *cols)
使用给定的分隔符sep 将多个输入字符串列连接到一个字符串列中。
>>> df = sqlContext.createDataFrame([('abcd','123')], ['s', 'd'])
>>> df.select(concat_ws('-', df.s, df.d).alias('s')).collect()
[Row(s=u'abcd-123')]
concat(*cols)
将多个输入字符串列连接成一个字符串列。
>>> df = sqlContext.createDataFrame([('abcd','123')], ['s', 'd'])
>>> df.select(concat(df.s, df.d).alias('s')).collect()
[Row(s=u'abcd123')]
两者差异
当使用concat(*cols)拼接,当某个字段为NULL,会拼接生成空行,导致数据缺失
>>> df = spark.createDataFrame([([1, 2], [3, 4], [5]), ([1, 2], None, [3])], ['a', 'b', 'c'])
>>> df.select(concat(df.a, df.b, df.c).alias("arr")).collect()
[Row(arr=[1, 2, 3, 4, 5]), Row(arr=None)]
import pyspark.sql.functions as F
d = df.withColumn("sep", F.lit("|$|"))
data = d.select(F.concat(d.a, d.Sep, d.b, d.Sep, d.c).alias('s'))
同时也可以作为一种过滤方式,将字段为NULL的数据过滤掉
如果需要保留字段为NULL的数据,使用concat_ws(sep, *cols)
data_ws = d.select(F.concat_ws('|$|', d.a, d.b, d.c).alias('s'))