使用 sparksql 访问嵌套 json 数据的子字段

Posted

技术标签:

【中文标题】使用 sparksql 访问嵌套 json 数据的子字段【英文标题】:Accessing child fields of a nested json data using sparksql 【发布时间】:2016-05-23 12:20:01 【问题描述】:

我正在使用 hadoop 作业历史文件日志数据进行探索性数据分析。 下面给出的是用于分析的样本数据

"type":"AM_STARTED","event":"org.apache.hadoop.mapreduce.jobhistory.AMStarted":"applicationAttemptId":"appattempt_1450790831122_0001_000001","startTime":1450791753482,"containerId":"container_1450790831122_0001_01_000001","nodeManagerHost":"centos65","nodeManagerPort":52981,"nodeManagerHttpPort":8042

我只需要选择事件的applicationAttemptId,startTime,containerId等子值

org.apache.hadoop.mapreduce.jobhistory.AMStarted

我尝试了以下简单的选择查询

val out=sqlcontext.sql("select event.org.apache.hadoop.mapreduce.jobhistory.AMStarted.applicationAttemptId from sample")

但它会引发以下错误

org.apache.spark.sql.analysisException: org.apache.hadoop.mapreduce.jobhistory.AMStarted.applicationAttemptId 中没有这样的结构字段 org

不幸的是,数据字段看起来像这样“org.apache.hadoop.mapreduce.jobhistory.AMStarted”

我自己操纵了数据,就像这个 org_apache_hadoop_mapreduce_jobhistory.AMStarted 并尝试了下面这个相同的查询

val out=sqlcontext.sql("select event.org_apache_hadoop_mapreduce_jobhistory_AMStarted.applicationAttemptId from sample")

现在我可以访问 AMStarted 的子字段。但这不是正确的做法, 有什么方法可以在不处理数据的情况下做到这一点。

【问题讨论】:

【参考方案1】:

在花了一些时间寻找解决方案之后,我想到了在字段名称中使用反引号作为引号的简单想法。

`org.apache.hadoop.mapreduce.jobhistory`.AMStarted

然后查询就像一个魅力,

val out=sqlcontext.sql("select event.`org.apache.hadoop.mapreduce.jobhistory.AMStarted'.applicationAttemptId from sample")

【讨论】:

以上是关于使用 sparksql 访问嵌套 json 数据的子字段的主要内容,如果未能解决你的问题,请参考以下文章

Spark高级操作之json复杂和嵌套数据结构的操作一

Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”

如何使用 AWS Glue 从嵌套 json 字段/结构中的 DynamicFrame 访问数据

使用 Vue 访问嵌套的 JSON

使用 AngularJS 访问嵌套的 JSON

使用 Spark 访问嵌套在结构中的 json 数组