2016-05-09 43 views
5

olarak REST hizmetinden nasıl tüketirim? Web servisinden bazı JSON verilerini okumanız gerekirse, SPARK SQL kodundaki verileri analiz için sorgulamak için REST arabirimleri sağlar. Blob deposunda depolanmış bir JSON'u okuyabiliyorum ve kullanabiliyorum.Spark SQL: Json verilerini DataFrame

Verileri bir REST hizmetinden okumak ve başka bir DataFrame gibi kullanmak için en iyi yolun ne olduğunu merak ediyordum.

BTW Bu yardımcı olursa SPARK 1.6 of Linux cluster on HD insight kullanıyorum. Ayrıca, birisi SPARK ortamına hala çok yeni olduğum için herhangi bir kod parçacığını aynı şekilde paylaşabiliyorsa memnun olur. Spark 1.6 On

+0

indirdikten sonra (düğümlerine dağıtmak) parallelize istediğiniz tek bir JSON damla o olduğu gibi bir dataframe oluşturabilir veya birçok olduğu doğrudan düğümlerde indirmeyi tercih edebileceğiniz farklı JSON dizeleri? Tek bir blob ise, http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets adresinde belirtildiği gibi biçimlendirilmiştir. Her satır ayrı, bağımsız bir geçerli JSON içermelidir. object " – Ashish

+1

@Ashish: Bunlar aslında webservice tarafından 8 ile 10 arasında bir yerde bulunan ve gerçekten büyük boyutlu olmayan çok sayıda dosyadır. Analizlerim için çoğunlukla HDFS'de depolanan verilere bir bağlam olarak kullanılır. Bağlantıya baktım, ama bütün örnekler yerel dosyaları arıyor, onu bir şekilde okumak için bir yol var mı? Val yolu = "http: //www.examples/src/main/resources? Type = people "' – Kiran

+0

Spark, rasgele bir json'u veri çerçevesine ayrıştıramaz, çünkü json hiyerarşik bir yapıdır ve veri ağı düzdür. Eğer jsonunuz kıvılcım tarafından yaratılmadıysa, "Her satır ayrı, bağımsız bir JSON nesnesi içermelidir" ve bu nedenle özel kodunuzu kullanarak ayrıştırılması ve daha sonra veri kümesine veri toplama işlemine aktarılması gerekir. sınıf nesneleri veya kıvılcım sql Satırları. scala'da ayrıştırma yollarından biri http://stackoverflow.com/questions/37003083/spark-parquet-nested-value-flatten/37005148#37005148 – Ashish

cevap

4

: Eğer Python üzerinde ise

, bilgi almak için requests kitaplığını kullanın ve sonra sadece ondan bir RDD oluşturun. Scala için benzer bir kütüphane olmalı (ilgili thread). Sonra sadece yapın:

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

Kod Scala için:

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

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

+0

@Kiran lütfen sorunuza cevap veren cevapları kabul edin – aggFTW

1

json olarak hiyerarşik yapı ve dataframe çünkü dataframe için keyfi bir json ayrıştırmak olamaz Kıvılcım düz. Eğer jsonunuz kıvılcım tarafından yaratılmamışsa, o zaman condition'a uygun olmadıklarıdır. "Her satır ayrı, bağımsız bir JSON nesnesi içermelidir" ve bu nedenle özel kodunuzu kullanarak ayrıştırılması ve ardından veri kümesine beslenmesi gerekir. vaka sınıfı nesnelerin veya kıvılcım sql satırlarının toplanması.

Sen gibi indirebilirsiniz:

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

ve sonra shown in this answer olarak json ayrıştırmak. Ve sonra küçük harf sınıfın nesneleri Seq (diyelim sekans) oluşturmak ve

seq.toDF