带索引的爆炸列

时间:2018-06-21 16:09:10

标签: 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")))

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

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

(我可以想到要这样做的技巧。首先将数组字段变成具有原始值和索引的元组的数组。然后进行爆炸。然后将元组解包。但是还有更优雅的方法吗?)

1 个答案:

答案 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|
+---+---+---+