如何在 Spark 中将数组分解为多列

Posted

技术标签:

【中文标题】如何在 Spark 中将数组分解为多列【英文标题】:How to explode an array into multiple columns in Spark 【发布时间】:2018-03-26 19:33:31 【问题描述】:

我有一个 spark 数据框,如下所示:

id   DataArray
a    array(3,2,1)
b    array(4,2,1)     
c    array(8,6,1)
d    array(8,2,4)

我想将此数据框转换为:

id  col1  col2  col3
a    3     2     1
b    4     2     1
c    8     6     1 
d    8     2     4

我应该使用什么功能?

【问题讨论】:

【参考方案1】:

使用apply:

import org.apache.spark.sql.functions.col

df.select(
  col("id") +: (0 until 3).map(i => col("DataArray")(i).alias(s"col$i")): _*
)

【讨论】:

我无法解析 import org.apache.spark.sql.col ,请问您使用的是哪个版本的 spark。我们需要任何额外的软件包吗? import org.apache.spark.sql.col :23: error: object col is not a member of package org.apache.spark.sql【参考方案2】:

您可以使用foldLeftDataArray 前添加每个columnn

列出要添加的列名

val columns = List("col1", "col2", "col3")

columns.zipWithIndex.foldLeft(df) 
  (memodDF, column) => 
    memodDF.withColumn(column._1, col("dataArray")(column._2))
  

  .drop("DataArray")

希望这会有所帮助!

【讨论】:

以上是关于如何在 Spark 中将数组分解为多列的主要内容,如果未能解决你的问题,请参考以下文章

如何在大查询中将数组转换为多列

如何在 Python 中将一个数组中的多列堆叠在一起?

在 Spark-Scala 中将单个字符串列拆分为多列

Apache Spark 数据框列爆炸为多列

在 Spark 中独立分解多个列

如何在 Spark Scala 中将 WrappedArray 转换为 List?