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

0sgqnhkj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(398)

我正在用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}}}

我只需要选择事件的applicationattentid、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.applicationattentid中没有此类结构字段org
不幸的是,数据字段看起来像“org.apache.hadoop.mapreduce.jobhistory.amstarted”
我自己操作了数据,比如org\u apache\u hadoop\u mapreduce\u jobhistory.amstart,并尝试了下面这样的查询

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

现在我可以访问amstarted的子字段了。但是这样做是不对的,有没有不操纵数据的方法呢。

mzillmmw

mzillmmw1#

在花了大量时间搜索一个解决方案之后,我有了一个简单的想法,即在域名中使用反勾号作为引号。

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

然后查询就像一个符咒,

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

相关问题