连接数据框中包含true的列的名称

时间:2018-08-05 15:58:01

标签: scala apache-spark apache-spark-sql

我有一个看起来像这样的数据框:

|id|type|isBlack|isHigh|isLong|  
|1 |A   |true   |false |null  |  
|2 |B   |true   |true  |true  |  
|3 |C   |false  |null  |null  |  

我正在尝试将包含“ true”的列的名称连接到另一列中以获取此信息:

|id|type|isBlack|isHigh|isLong|Description          |
|1 |A   |true   |false |null  |isBlack              |
|2 |B   |true   |true  |true  |isBlack,isHigh,isLong|
|3 |C   |false  |null  |null  |null                 |

现在,我有一个预定义的列名列表,需要检查(在此示例中为Seq(“ isBlack”,“ isHigh”,“ isLong”),这些列存在于数据帧中(此列表可能会有些长)。

1 个答案:

答案 0 :(得分:1)

val cols = Seq("isBlack", "isHigh", "isLong")

df.withColumn("description", concat_ws(",", cols.map(x => when(col(x), x)): _*)).show(false)
+---+----+-------+------+------+---------------------+
|id |type|isBlack|isHigh|isLong|description          |
+---+----+-------+------+------+---------------------+
|1  |A   |true   |false |null  |isBlack              |
|2  |B   |true   |true  |true  |isBlack,isHigh,isLong|
|3  |C   |false  |null  |null  |                     |
+---+----+-------+------+------+---------------------+

当值为map时,首先将true列转换为列名,

cols.map(x => when(col(x), x))

然后使用concat_ws合并列concat_ws(",", cols.map(x => when(col(x), x)): _*)