2016-05-23 69 views
1

我正在做一个探索性数据分析与hadoop作业历史文件日志数据。 下面给出的是用于分析使用sparksql访问嵌套json数据的子字段

{"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,开始时间,事件的数据筒子值

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.apache.hadoop.mapreduce.jobhistory.AMStarted”

我操纵的数据自己这样org_apache_hadoop_mapreduce_jobhistory.AMStarted并试图像下面这一个

相同的查询3210
val out=sqlcontext.sql("select event.org_apache_hadoop_mapreduce_jobhistory_AMStarted.applicationAttemptId from sample") 

现在我可以访问AMStarted的子字段。但这不是正确的方式, 有没有办法在不操作数据的情况下这样做。

回答

1

花了一些高质量的时间寻找解决方案后,得到了使用back ticks的简单想法,因为字段名称中的引号对我来说不对。

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

然后是查询工作就像一个魅力,

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