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

标签 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: 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/

相关文章:

hadoop - 最好是加缪或地精

scala - 运行 pyspark 代码 zepplin 时出现 NoSuchMethodException : scala. tools.nsc.interpreter.ILoop.scala

elasticsearch - saveToEs( Elasticsearch Spark )添加作业但未开始

hadoop - 每次启动hadoop都需要密码

java - 如何在Java中从S3读取Snappy压缩文件

apache-spark - 从 Eclipse 和 Spark Context 将 Spark 应用程序作为 yarn 作业提交

c++ - 为 C++ 编写 JSON 解析器

python - python中过滤json对象的json数组的高效方法

javascript - Groovy Grails 发送/接收变量

java - 如何规范 MongoDB 中的数据模型/JSON?