2016-05-09 15 views
5

Ho bisogno di leggere alcuni dati JSON da un servizio Web che fornisce interfacce REST per interrogare i dati dal mio codice SQL SPARK per l'analisi. Sono in grado di leggere un JSON memorizzato nell'archivio BLOB e usarlo.SQL Spark: come utilizzare i dati json da un servizio REST come DataFrame

Mi chiedevo quale sia il modo migliore per leggere i dati da un servizio REST e utilizzarlo come qualsiasi altro DataFrame.

BTW Sto usando SPARK 1.6 of Linux cluster on HD insight se questo aiuta. Apprezzeremmo anche se qualcuno potesse condividere frammenti di codice per gli stessi che sono ancora molto nuovi nell'ambiente SPARK.

+0

è esso un unico blob JSON che si desidera parallelizzare (distribuire ai nodi) dopo il download, o si tratta di molti diverse stringhe JSON che preferiresti scaricare direttamente nei nodi? Se un singolo blob è formattato come indicato su http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets "Ogni riga deve contenere un JSON valido separato e autonomo object " – Ashish

+1

@Ashish: questi sono in realtà più file esposti dal mio webservice da qualche parte nell'ordine da 8 a 10 e non molto grandi. Utilizzato principalmente come contesto per i dati memorizzati nell'HDFS per la mia analisi. Ho guardato il link, ma tutti gli esempi stanno cercando i file locali, c'è un modo per leggerlo un po 'come questo 'val path =" http: //www.examples/src/main/resources? Type = people "' – Kiran

+0

Spark non può analizzare un json arbitrario su dataframe, perché json è struttura gerarchica e dataframe piatta. Se il tuo json non viene creato da spark, è probabile che non sia conforme a "Ogni riga deve contenere un oggetto JSON valido e autonomo valido" e quindi dovrà essere analizzato usando il tuo codice personalizzato e quindi inserito nel dataframe come raccolta di oggetti case class o spark sql Rows. uno dei modi per fare il parsing in scala è mostrato in http://stackoverflow.com/questions/37003083/spark-parquet-nested-value-flatten/37005148#37005148 – Ashish

risposta

4

Su Spark 1.6:

Se siete su Python, utilizzare la biblioteca requests per ottenere le informazioni e poi basta creare un RDD da esso. Ci deve essere una libreria simile per Scala (rilevante thread). Poi basta fare:

json_str = '{"executorCores": 2, "kind": "pyspark", "driverMemory": 1000}' 
rdd = sc.parallelize([json_str]) 
json_df = sqlContext.jsonRDD(rdd) 
json_df 

Codice in Scala:

val anotherPeopleRDD = sc.parallelize(
    """{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}""" :: Nil) 
val anotherPeople = sqlContext.read.json(anotherPeopleRDD) 

Questo è da: http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets

+0

@ Kiran, ti preghiamo di accettare le risposte che rispondono alla tua domanda – aggFTW

1

Spark non può analizzare un JSON arbitrario dataframe, perché JSON è la struttura gerarchica e dataframe come piatto. Se il tuo json non viene creato da una scintilla, è probabile che non sia conforme a condition "Ogni riga deve contenere un oggetto JSON valido e autonomo valido" e quindi dovrà essere analizzato usando il tuo codice personalizzato e quindi inviato a dataframe come raccolta di oggetti case-class o spark sql Rows.

È possibile scaricare come:

import scalaj.http._ 
val response = Http("proto:///path/to/json") 
    .header("key", "val").method("get") 
    .execute().asString.body 

e quindi analizzare il vostro JSON come shown in this answer. E quindi creare un Seq di oggetti del vostro caso classe (diciamo seguenti) e creare una dataframe come

seq.toDF