我正在使用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")