我有一个带有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 |
+--------------+-----------+---------+--------+
在第二行结果中加倍。
有没有办法避免这种情况并获得预期的结果?
答案 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|
#+-------+-------+-------+------------+