带有索引的爆炸列

Posted

技术标签:

【中文标题】带有索引的爆炸列【英文标题】: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 来做到这一点。首先将数组字段变成原始值和索引的元组数组。然后进行分解。然后解包元组。但是有没有更优雅的方法?)

【问题讨论】:

Extracting array index in Spark Dataframe的可能重复 【参考方案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|
+---+---+---+

【讨论】:

以上是关于带有索引的爆炸列的主要内容,如果未能解决你的问题,请参考以下文章

GAE 大表中的索引以啥速度“爆炸”?

Spark 在 Scala 中爆炸 - 将爆炸列添加到行

如何爆炸列?

爆炸和拆分列导致数据不匹配

在 Pyspark 中爆炸不是数组的结构列

pandas DataFrame 爆炸列内容[重复]