如何在 Scala/Spark 的数据框中扩展数组 [重复]

Posted

技术标签:

【中文标题】如何在 Scala/Spark 的数据框中扩展数组 [重复]【英文标题】:How can I expand an Array in a Dataframe in Scala/Spark [duplicate] 【发布时间】:2017-06-24 10:50:25 【问题描述】:

我使用 Databricks spark-xml 包将 XML 文件读入 Spark。该文件具有以下数据结构:

<lib>
 <element>
  <genre>Thriller</genre>
  <dates>
   <date>2000-10-01</date>
   <date>2020-10-01</date>
  </dates>
 </element>
 <element>
  <genre>SciFi</genre>
  <dates>
   <date>2015-10-01</date>
  </dates>
 </element>
</lib>    

加载数据后,我得到一个如下所示的数据框:

root
 |-- genre: string (nullable = true)
 |-- publish_dates: struct (nullable = true)
 |    |-- publish_date: array (nullable = true)
 |    |    |-- element: string (containsNull = true)

而“show”会产生以下结果:

gerne | dates
Th... | [WrappedArray(20...

是否有可能以如下形式得到这个结果:

gerne | date
Th... | 2000-...
Th... | 2020-...
Sci.. | 2015-...

我已经试过了:

val rdd = df.select("genre", "dates").rdd.map(row => (row(0), row(1))).flatMapValues(_.toString)

val rdd = df.select("genre", "dates").rdd.map(row => (row(0), Array(row(1)).toList)).flatMap 
  case (label, list) => 
    list.map( (_, label))
  

val rdd = df.select("genre", "dates").withColumn("genre", explode($"dates"))

但是没有什么能让我得到正确的结果,事实上最后一个版本根本不起作用,但我通过谷歌犯规了。

任何帮助或提示将不胜感激。

【问题讨论】:

【参考方案1】:

你提到你的schema

root
 |-- genre: string (nullable = true)
 |-- publish_dates: struct (nullable = true)
 |    |-- publish_date: array (nullable = true)
 |    |    |-- element: string (containsNull = true)

这表明你的dataframe

+--------+--------------------------------------+
|genre   |publish_dates                         |
+--------+--------------------------------------+
|thriller|[WrappedArray(2000-10-01, 2020-10-01)]|
+--------+--------------------------------------+

如果是这种情况,那么遵循 explode 函数应该会给你想要的输出

val finaldf = df.select("genre", "publish_dates").withColumn("publish_dates", explode(col("publish_dates.publish_date")))
finaldf.show(false)

谁的输出是

+--------+-------------+
|genre   |publish_dates|
+--------+-------------+
|thriller|2000-10-01   |
|thriller|2020-10-01   |
+--------+-------------+

【讨论】:

非常感谢。这工作正常。 @JanusJato,很高兴听到这个答案有帮助:) 你也可以通过接受它来帮助我。 :) 并在您符合条件时投赞成票

以上是关于如何在 Scala/Spark 的数据框中扩展数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

如何访问存储在scala spark中的数据框中的映射值和键

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]

在 scala spark 数据框中提取时间间隔

是否可以从 Scala(spark) 调用 python 函数

Scala/Spark - 如何获取所有子数组的第一个元素