2016-05-09 5 views
5

verbrauchen Ich brauche einige JSON-Daten von einem Web-Service, der REST-Schnittstellen bietet, um die Daten aus meinem SPARK SQL-Code für die Analyse abzufragen. Ich kann ein JSON lesen, das im BLOB-Speicher gespeichert ist, und es verwenden.Spark SQL: Wie JSON-Daten von einem REST-Service als DataFrame

Ich fragte mich, was ist der beste Weg, um die Daten aus einem REST-Service zu lesen und es wie eine andere DataFrame zu verwenden.

BTW Ich verwende SPARK 1.6 of Linux cluster on HD insight, wenn das hilft. Würde mich auch freuen, wenn jemand Code-Snippets für das selbe teilen kann, da ich in der SPARK Umgebung noch sehr neu bin.

+0

ist es ein einzelner JSON Blob, die Sie (verteilen zu Knoten) nach dem Download parallelisieren wollen, oder ist es viele verschiedene JSON-Strings, die Sie lieber direkt in den Knoten herunterladen würden? Wenn es sich um ein einzelnes Blob handelt, wird es wie unter http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets beschrieben formatiert. "Jede Zeile muss eine separate, in sich abgeschlossen gültige JSON enthalten Objekt " – Ashish

+1

@Ashish: Dies sind tatsächlich mehrere Dateien, die von meinem Webservice irgendwo in der Größenordnung von 8 bis 10 angezeigt werden und nicht wirklich groß sind. Meistens als Kontext zu den im HDFS gespeicherten Daten für meine Analyse verwendet. Ich habe mir den Link angeschaut, aber alle Beispiele suchen nach den lokalen Dateien, gibt es eine Möglichkeit, sie so zu lesen wie 'val path = "http: //www.examples/src/main/resources? Type = people "' – Kiran

+0

Spark kann einen beliebigen JSON nicht zum Datenframe analysieren, weil JSON eine hierarchische Struktur und ein Datenrahmen als flach ist. Wenn Ihr JSON nicht durch Funken erstellt wird, ist es wahrscheinlich, dass es nicht entspricht "Jede Zeile muss ein separates, eigenständiges gültiges JSON-Objekt enthalten" und muss daher mit Ihrem benutzerdefinierten Code analysiert und dann als Sammlung an Dataframe übergeben werden von Fallklassenobjekten oder Spark-SQL-Zeilen. Eine der Möglichkeiten, um in scala zu analysieren ist in http://stackoverflow.com/questions/37003083/spark-parquet-nested-value-flatten/37005148#37005148 – Ashish

Antwort

4

auf Spark-1.6:

Wenn Sie auf Python sind, verwenden Sie die requests Bibliothek, die Informationen zu bekommen und dann einfach eine RDD daraus erstellen. Es muss eine ähnliche Bibliothek für Scala geben (relevant thread). Dann tun gerade:

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

-Code für Scala:

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

Dies ist aus: http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets

+0

@Kiran akzeptieren Sie bitte Antworten, die Ihre Frage beantworten – aggFTW

1

Funke kann eine beliebige json zu Datenrahmen nicht analysieren, da json hierarchische Struktur und Datenrahmen ist als eben. Wenn Ihr JSON nicht von Spark erstellt wird, ist es wahrscheinlich, dass es condition nicht entspricht "Jede Zeile muss ein separates, eigenständiges gültiges JSON-Objekt enthalten" und muss daher mit Ihrem benutzerdefinierten Code analysiert und dann an Dataframe übergeben werden Sammlung von Fallklassenobjekten oder Spark-SQL-Zeilen.

können Sie kostenlos herunterladen wie:

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

und dann json als shown in this answer analysieren. Und dann eine Seq von Objekten Ihres Falles-Klasse (sagen wir f) zu erstellen und eine Datenrahmen erstellen, wie

seq.toDF 
Verwandte Themen