我正在对 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: no such struct field org in org.apache.hadoop.mapreduce.jobhistory.AMStarted.applicationAttemptId
不幸的是,数据字段看起来像这样“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 的子字段。但这不是这样做的正确方法, 有没有办法在不操纵数据的情况下做到这一点。
最佳答案
在花了一些时间寻找解决方案之后,我想到了在字段名称中使用反引号作为引号的简单想法,这对我来说是个窍门。
`org.apache.hadoop.mapreduce.jobhistory`.AMStarted
然后查询就像一个魅力,
val out=sqlcontext.sql("select event.`org.apache.hadoop.mapreduce.jobhistory.AMStarted'.applicationAttemptId from sample")
关于json - 使用 sparksql 访问嵌套 json 数据的子字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37390875/