带索引的爆炸列

Pau*_*ers 9 scala apache-spark-sql

我知道我可以像这样“分解”一列数组类型:

import org.apache.spark.sql._
import org.apache.spark.sql.functions.explode
val explodedDf = 
    payloadLegsDf.withColumn("legs", explode(payloadLegsDf.col("legs")))
Run Code Online (Sandbox Code Playgroud)

现在我有多行;数组中的每个项目一个。

有没有办法可以“用索引爆炸”?这样会有一个新列包含原始数组中项目的索引吗?

(我可以想到 hacks 来做到这一点。首先将数组字段变成原始值和索引的元组数组。然后进行爆炸。然后解压元组。但是有没有更优雅的方法?)

Ant*_*tot 17

如果您使用的是 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"))
Run Code Online (Sandbox Code Playgroud)

这将为pos位置/索引和col提取的值创建两个新列:

+---+---+---+
| id|pos|col|
+---+---+---+
|  1|  0|  a|
|  1|  1|  b|
|  2|  0|  c|
|  2|  1|  d|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)