下面给出了Dataframe的模式。
|-- 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\u ws也可以。
val finalDf = df.withColumn("concatColumn", concat_ws(expr.toList:_*))
1条答案
按热度按时间2mbi3lxu1#
如果你有spark 3,你可以用
transform_values
转换Map列以获得所需的输出。