2016-05-09 18 views
5

Potrzebuję odczytać niektóre dane JSON z usługi sieci Web dostarczającej interfejsy REST w celu zapytania danych z mojego kodu SQL SPARK do analizy. Jestem w stanie odczytać JSON przechowywany w sklepie blob i używać go.Spark SQL: Jak pochłonąć dane json z usługi REST jako DataFrame

Zastanawiam się, jaki jest najlepszy sposób, aby odczytać dane z usługi REST i używać go jak każdego innego DataFrame.

BTW Używam SPARK 1.6 of Linux cluster on HD insight, jeśli to pomaga. Byłoby to również doceniane, gdyby ktoś mógł udostępniać dowolne fragmenty kodu w taki sam sposób, jak ja wciąż jestem bardzo nowym środowiskiem SPARK.

+0

jest to pojedynczy JSON blob że chcesz parallelize (dystrybuować do węzłów) po pobraniu, czy jest to wiele różne ciągi JSON, które wolisz pobierać bezpośrednio w węzłach? Jeśli jest to pojedynczy obiekt typu blob, to jest on sformatowany zgodnie z opisem pod adresem http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets "Każda linia musi zawierać osobny, samodzielny poprawny JSON obiekt " – Ashish

+1

@Ashish: Są to w rzeczywistości wiele plików odsłoniętych przez moją usługę internetową gdzieś w kolejności od 8 do 10 i niezbyt duży rozmiar. Przeważnie używany jako kontekst do danych przechowywanych w HDFS dla mojej analizy. Spojrzałem na link, ale wszystkie przykłady szukają plików lokalnych, czy istnieje sposób, aby go przeczytać w taki sposób, jak ta 'val path =" http: //www.examples/src/main/resources? Type = people "' – Kiran

+0

Spark nie może parsować arbitralnej json do ramki danych, ponieważ json jest strukturą hierarchiczną, a ramka danych jest płaska. Jeśli twój json nie jest tworzony przez iskrę, istnieje ryzyko, że nie jest zgodny z "Każda linia musi zawierać oddzielny, samodzielny prawidłowy obiekt JSON", a zatem będzie musiał zostać przeanalizowany przy użyciu twojego niestandardowego kodu, a następnie dostarczony do ramki danych jako kolekcja obiektów klasy case lub wierszy sql sql. jeden ze sposobów robienia skryptów w scala jest pokazany w http://stackoverflow.com/questions/37003083/spark-parquet-nested-value-flatten/37005148#37005148 – Ashish

Odpowiedz

4

Na Spark 1.6:

Jeśli jesteś w Pythonie, korzystania z biblioteki requests, aby uzyskać informacje, a następnie po prostu stworzyć RDD od niego. Musi istnieć podobna biblioteka dla Scala (odpowiednia thread). Następnie wystarczy zrobić:

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

kod do Scala:

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

Jest od: http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets

+0

@Kiran, proszę przyjąć odpowiedzi, które odpowiedzą na twoje pytanie – aggFTW

1

Spark nie może przetworzyć dowolny json do dataframe, ponieważ json jest hierarchiczna struktura i dataframe jako mieszkanie. Jeśli twój json nie jest tworzony przez iskrę, prawdopodobnie nie jest zgodny z condition "Każda linia musi zawierać oddzielny, samowystarczalny, prawidłowy obiekt JSON", a zatem będzie wymagać przeanalizowania za pomocą niestandardowego kodu, a następnie przesłania do ramki danych jako kolekcja obiektów klasy case lub wierszy sql sql.

Możesz pobrać jak:

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

a następnie zanalizować swoją json jako shown in this answer. A następnie utworzyć nast obiektów Twojej sprawy klasy (słownie nast) i stworzyć dataframe jak

seq.toDF