我知道我可以像这样“爆炸”一个数组类型的列:
import org.apache.spark.sql._
import org.apache.spark.sql.functions.explode
val explodedDf =
payloadLegsDf.withColumn("legs", explode(payloadLegsDf.col("legs")))
现在我有多行;数组中的每一项。
有没有一种方法可以“用索引爆炸”?这样会有一个新列包含原始数组中该项的索引?
(我可以想到要这样做的技巧。首先将数组字段变成具有原始值和索引的元组的数组。然后进行爆炸。然后将元组解包。但是还有更优雅的方法吗?)
答案 0 :(得分:1)
如果您使用的是Spark 2.1+,则可以使用posexplode
函数:
为每个元素在给定数组或地图列中的位置创建一个新行。
示例:
val df = Seq(
(1L, Array[String]("a", "b")),
(2L, Array[String]("c", "d"))
).toDF("id", "items")
val res = df.select($"id", posexplode($"items"))
这将创建两个新列,pos
用于位置/索引,col
用于提取值:
+---+---+---+
| id|pos|col|
+---+---+---+
| 1| 0| a|
| 1| 1| b|
| 2| 0| c|
| 2| 1| d|
+---+---+---+