使用concat_ws时排除空列

时间:2018-08-20 19:52:59

标签: apache-spark pyspark

我有一个带有StringType列的数据框。我需要串联3列,并将结果放在其他列中。我正在这样使用concat_ws:

from pyspark.context import SparkContext
from pyspark.sql import functions as f

def myConcat(*cols):
    return f.trim(f.concat_ws('-', *[f.coalesce(c, f.lit("")) for c in cols]))

df = df.withColumn('Column1', myConcat(df['Column2'], df['Column3'], df['Column4'])).show()

这是期望的结果:

+--------------+-----------+---------+--------+
|Column1       |Column2    |Column3  |Column4 |
+--------------+-----------+---------+--------+
| abcd-efg-hij |   abcd    |      efg|  hij   |
| s675-klm     |   s675    |         |  klm   |
+--------------+-----------+---------+--------+

但是,有些列是空的,当我运行上面的脚本时,我得到的是这样的:

+--------------+-----------+---------+--------+
|Column1       |Column2    |Column3  |Column4 |
+--------------+-----------+---------+--------+
| abcd-efg-hij |   abcd    |      efg|  hij   |
| s675--klm    |   s675    |         |  klm   |
+--------------+-----------+---------+--------+

在第二行结果中加倍。

有没有办法避免这种情况并获得预期的结果?

1 个答案:

答案 0 :(得分:1)

将“字符串”列中的空字符串替换为NULL应该可以:

import pyspark.sql.functions as f

def myConcat(*cols):
    return f.trim(f.concat_ws('-', *[f.when(c != '', c) for c in cols]))

df.withColumn('Column1', myConcat(df['Column2'], df['Column3'], df['Column4'])).show()
#+-------+-------+-------+------------+
#|Column2|Column3|Column4|     Column1|
#+-------+-------+-------+------------+
#|   abcd|    efg|    hij|abcd-efg-hij|
#|   s675|       |    klm|    s675-klm|
#+-------+-------+-------+------------+