【问题标题】:How can I expand an Array in a Dataframe in Scala/Spark [duplicate]如何在 Scala/Spark 的数据框中扩展数组 [重复]
【发布时间】: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"))

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

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

【问题讨论】:

    标签: scala apache-spark apache-spark-xml


    【解决方案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,很高兴听到这个答案有帮助:) 你也可以通过接受它来帮助我。 :) 并在您符合条件时投赞成票
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2020-03-18
    • 2017-08-08
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多