2016-05-23 68 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")