我试图从wson api获取json数据中的数据
我能够打印完全
的模式scala> data.printSchema
root
|-- batchcomplete: string (nullable = true)
|-- query: struct (nullable = true)
| |-- pages: struct (nullable = true)
| | |-- 28597189: struct (nullable = true)
| | | |-- ns: long (nullable = true)
| | | |-- pageid: long (nullable = true)
| | | |-- revisions: array (nullable = true)
| | | | |-- element: struct (containsNull = true)
| | | | | |-- *: string (nullable = true)
| | | | | |-- contentformat: string (nullable = true)
| | | | | |-- contentmodel: string (nullable = true)
| | | |-- title: string (nullable = true)
我想提取密钥“*”|-- *: string (nullable = true)
的数据
请给我一个解决方案。
一个问题是
pages: struct (nullable = true)
| | |-- 28597189: struct (nullable = true)
号码28597189对每个标题都是唯一的。
答案 0 :(得分:1)
首先我们需要解析json以动态获取密钥(28597189),然后使用它从spark数据框中提取数据,如下所示
val keyName = dataFrame.selectExpr("query.pages.*").schema.fieldNames(0)
println(s"Key Name : $keyName")
这将动态地为您提供密钥:
Key Name : 28597189
然后使用它来提取数据
var revDf = dataFrame.select(explode(dataFrame(s"query.pages.$keyName.revisions")).as("revision")).select("revision.*")
revDf.printSchema()
输出:
root
|-- *: string (nullable = true)
|-- contentformat: string (nullable = true)
|-- contentmodel: string (nullable = true)
我们将使用*
star_column
revDf = revDf.withColumnRenamed("*", "star_column")
revDf.printSchema()
输出:
root
|-- star_column: string (nullable = true)
|-- contentformat: string (nullable = true)
|-- contentmodel: string (nullable = true)
一旦我们有了最终的数据框,我们就会调用show
revDf.show()
输出:
+--------------------+-------------+------------+
| star_column|contentformat|contentmodel|
+--------------------+-------------+------------+
|{{EngvarB|date=Se...| text/x-wiki| wikitext|
+--------------------+-------------+------------+