【发布时间】:2016-11-09 16:02:45
【问题描述】:
假设我通过以下方式将 json 文件加载到 Spark 1.6 中
sqlContext.read.json("/hdfs/")
它给了我一个具有以下架构的数据框:
root
|-- id: array (nullable = true)
| |-- element: string (containsNull = true)
|-- checked: array (nullable = true)
| |-- element: string (containsNull = true)
|-- color: array (nullable = true)
| |-- element: string (containsNull = true)
|-- type: array (nullable = true)
| |-- element: string (containsNull = true)
DF 只有一行,里面有一个包含我所有项目的数组。
+--------------------+--------------------+--------------------+
| id_e| checked_e| color_e|
+--------------------+--------------------+--------------------+
|[0218797c-77a6-45...|[false, true, tru...|[null, null, null...|
+--------------------+--------------------+--------------------+
我想要一个将数组分解为每行一项的 DF。
+--------------------+-----+-------+
| id|color|checked|
+--------------------+-----+-------+
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
|0218797c-77a6-45f...| null| false|
...
到目前为止,我通过从数组 DF 创建一个临时表并使用带有横向视图的 sql 来实现这一点。
val results = sqlContext.sql("
SELECT id, color, checked from temptable
lateral view explode(checked_e) temptable as checked
lateral view explode(id_e) temptable as id
lateral view explode(color_e) temptable as color
")
有没有什么方法可以不使用 SQL 直接使用 Dataframe 函数实现这一点?我知道有类似 df.explode(...) 但我无法让它与我的数据一起使用
编辑:看起来爆炸并不是我真正想要的。 我想要一个新的数据框,它逐行包含数组的每个项目。与我的初始数据集相比,explode 函数实际上返回的行数更多。
【问题讨论】:
标签: arrays json scala apache-spark explode