2015-04-29 26 views
17

Ho uno schema come mostrato di seguito. Come posso analizzare gli oggetti nidificatiCome analizzare gli oggetti JSON nidificati in spark sql?

root 
|-- apps: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- appName: string (nullable = true) 
| | |-- appPackage: string (nullable = true) 
| | |-- Ratings: array (nullable = true) 
| | | |-- element: struct (containsNull = true) 
| | | | |-- date: string (nullable = true) 
| | | | |-- rating: long (nullable = true) 
|-- id: string (nullable = true) 
+1

cosa avete provato finora? – eliasah

+0

Stavo cercando di trattare ogni oggetto JSON come una stringa e lo analizzo usando il parser JSONDecoder. – None

risposta

22

Supponendo che si legge in un file JSON e stampare lo schema che ci stanno dimostrando in questo modo:

DataFrame df = sqlContext.read().json("/path/to/file").toDF(); 
    df.registerTempTable("df"); 
    df.printSchema(); 

Quindi è possibile selezionare oggetti nidificati all'interno di uno stru Tipo di ct in questo modo ...

DataFrame app = df.select("app"); 
     app.registerTempTable("app"); 
     app.printSchema(); 
     app.show(); 
DataFrame appName = app.select("element.appName"); 
     appName.registerTempTable("appName"); 
     appName.printSchema(); 
     appName.show(); 
+3

solo per aggiungere, sopra il codice non è necessario 'registerTempTable' per funzionare. È necessario 'registerTempTable' solo quando è necessario eseguire query spark sql. Anche 'registerTempTable' era stato deprecato da Spark 2.0 ed era stato sostituito da' createOrReplaceTempView' – Arjit

+0

Questo presuppone che tu conosca lo schema. Cosa succede se non si è sicuri dello schema dell'oggetto nidificato? Come si crea addirittura lo schema dell'oggetto nidificato? Ho fatto questa domanda anche qui: https://stackoverflow.com/questions/43438774/query-json-data-column-using-spark-dataframes-but-not-sure-about-its-schema –

+0

Sto avendo lo stesso problema, e questo codice non funziona per me. Quando provo a 'select (" app.element.appName ")' (oi campi analoghi per il mio caso, ottengo l'errore 'org.apache.spark.sql.AnalysisException: Nessun elemento struct field in ...' Il campo elemento non è presente nel json originale ma è creato per rappresentare un jsonarray, ma per qualche motivo non lo trova – Paul

3

Hai provato a fare direttamente dalla query SQL come

Select apps.element.Ratings from yourTableName 

Questo probabilmente restituisce un array e si può più facilmente accedere agli elementi al suo interno. Inoltre, utilizzo questo visualizzatore JSON in linea quando devo gestire strutture JSON di grandi dimensioni e lo schema è troppo complesso: http://jsonviewer.stack.hu/

Problemi correlati