【问题标题】:Exploding column with index带有索引的爆炸列
【发布时间】:2018-06-21 16:09:09
【问题描述】:
我知道我可以像这样“分解”数组类型的列:
import org.apache.spark.sql._
import org.apache.spark.sql.functions.explode
val explodedDf =
payloadLegsDf.withColumn("legs", explode(payloadLegsDf.col("legs")))
现在我有多个行;数组中的每一项都有一个。
有没有办法“用索引爆炸”?这样就会有一个新列包含原始数组中项目的索引?
(我可以想到 hacks 来做到这一点。首先将数组字段变成原始值和索引的元组数组。然后进行分解。然后解包元组。但是有没有更优雅的方法?)
【问题讨论】:
标签:
scala
apache-spark-sql
【解决方案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|
+---+---+---+