如何在 Scala/Spark 中扩展 Dataframe 中的数组
How can I expand an Array in a Dataframe in Scala/Spark
我使用 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"))
但是我没有得到正确的结果,事实上最后一个版本根本不起作用,但我通过 google 犯规了。
如有任何帮助或建议,我们将不胜感激。
你提到你的 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 |
+--------+-------------+
我使用 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"))
但是我没有得到正确的结果,事实上最后一个版本根本不起作用,但我通过 google 犯规了。
如有任何帮助或建议,我们将不胜感激。
你提到你的 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 |
+--------+-------------+