scala - 带有索引的爆炸列
问题描述
我知道我可以像这样“爆炸”一列类型数组:
import org.apache.spark.sql._
import org.apache.spark.sql.functions.explode
val explodedDf =
payloadLegsDf.withColumn("legs", explode(payloadLegsDf.col("legs")))
现在我有多行;数组中的每个项目一个。
有没有办法可以“用索引爆炸”?这样会有一个新列包含原始数组中项目的索引吗?
(我可以想到黑客来做到这一点。首先将数组字段变成原始值和索引的元组数组。然后进行分解。然后解包元组。但是有没有更优雅的方法?)
解决方案
如果您使用的是 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|
+---+---+---+
推荐阅读
- c - 为什么我的计算器不能用,我用C写的
- mysql - mySQL 在新创建的列上使用 where
- modelica - 分配到连接器
- python - 如何取消透视多列数据?
- latex - 进入小节后的缩进(背面)
- sql - 在 IIF 函数中使用 Select 语句
- python - Finding Eigenvalues with a Variable in the Matrix
- chromecast - 为 Google Cast Styled Media Receiver 设置支持的媒体命令
- cryptography - 使用 HKDF 的目的是什么?
- azure-function-app - 具有功能应用访问限制的 Azure CDN 提供 403 Forbidden