使用sparksql

时间:2016-05-23 12:20:01

标签: json hadoop apache-spark apache-spark-sql spark-dataframe

我正在使用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:org.apache.hadoop.mapreduce.jobhistory.AMStarted.applicationAttemptId

中没有这样的struct field org

不幸的是,数据字段看起来像这样" 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的子字段了。但这不是正确的方法, 有没有办法在不操纵数据的情况下这样做。

1 个答案:

答案 0 :(得分:1)

在花了一些时间寻找解决方案后,得到了一个简单的想法,使用后面的滴答作为字段名称中的引号为我做了诀窍。

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

然后查询就像一个魅力,

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