2016-05-23 11 views
1

Ich mache eine explorative Datenanalyse mit Protokolldaten von Hadoop-Jobverlaufsdateien. unten ist die Probendaten für die AnalyseZugriff auf untergeordnete Felder einer verschachtelten JSON-Daten mit Hilfe von Sparksql

{"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}}} 

Ich muss nur die untergeordneten Werte wie applicationAttemptId auswählen, Startzeit, containerId der

org.apache.hadoop.mapreduce.jobhistory Ereignis verwendet .AMStarted

i die unten einfache Auswahlabfrage versucht

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

aber es führt den unten Fehler

org.apache.spark.sql.analysisException: Keine solche struct Feld org in org.apache.hadoop.mapreduce.jobhistory.AMStarted.applicationAttemptId

leider das Datenfeld aussehen wie dieses „org.apache.hadoop.mapreduce.jobhistory.AMStarted“

i manipuliert, um die selbst Daten wie diese org_apache_hadoop_mapreduce_jobhistory.AMStarted und versucht, die gleiche Abfrage wie diese unter

Jetzt kann ich auf die untergeordneten Felder von AMStarted zugreifen. aber es ist nicht der richtige Weg, Gibt es eine Möglichkeit, dies zu tun, ohne die Daten zu manipulieren.

Antwort

1

Nachdem ich einige Zeit mit der Suche nach einer Lösung verbracht hatte, bekam ich die einfache Idee, Back-Ticks zu verwenden, da die Anführungszeichen im Feldnamen den Trick für mich darstellten.

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

Und dann die Abfrage funktioniert wie ein Zauber,

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