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



我正在使用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.mareduce.jobhistory.AMS启动

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

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.hadop.mapreduce.jobhistory.AMStarted">

我自己像这样操作数据org_apache_hadoop_mapreduce_jobhistory.AMS开始并在下面尝试了同样的查询

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

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

在花了一些高质量的时间搜索解决方案后,得到了在字段名称中使用反勾号作为引号的简单想法。

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

然后查询就像一个符咒,

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

相关内容

  • 没有找到相关文章

最新更新