如何用scala spark解析wiki信息框json

时间:2017-02-09 20:31:10

标签: json scala apache-spark

我试图从wson api获取json数据中的数据

https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=Rajanna&rvsection=0

我能够打印完全

的模式
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对每个标题都是唯一的。

1 个答案:

答案 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|
+--------------------+-------------+------------+