【发布时间】:2021-04-09 14:43:42
【问题描述】:
数据框的架构如下所示。
|-- idMap: map (nullable = true)
| |-- key: string
| |-- value: array (valueContainsNull = true)
| | |-- element: struct (containsNull = true)
| | | |-- id: string (nullable = true)
| | | |-- linked: boolean (nullable = true)
例如,如果一行中有 3 个键,我正在尝试将其转换为格式为 key1:id;key2:id;key3:id 的新字符串列,其中 id 是索引 0 处元素的一部分。
我试过的是
- 收集到列表的键
- 从键列表创建列列表
val expr = new scala.collection.mutable.ListBuffer[org.apache.spark.sql.Column]
keyList.foldLeft(expr)((expr, key) => expr += (lit(key), lit(":"), col("idMap")(key)(0)("id"), lit(";")))
- 使用传递给 concat 的列列表添加一个新列
val finalDf = df.withColumn("concatColumn", concat(expr.toList:_*))
它给了我一个空列,所以我假设这种方法有缺陷。任何意见将不胜感激。
编辑:@mck 的回答有效。在第 3 步中使用 concat_ws 也可以。
val finalDf = df.withColumn("concatColumn", concat_ws(expr.toList:_*))
【问题讨论】:
标签: scala dataframe apache-spark apache-spark-sql