web-dev-qa-db-ja.com

Spark SQL:a RESTサービスからjsonデータをDataFrameとして使用する方法

RESTインターフェースを提供するWebサービスからいくつかのJSONデータを読み取る必要があります。SPARK分析用のSQLコードからデータを照会します。私は読み取ることができますblobストアに格納されたJSONを使用します。

RESTサービスからデータを読み取り、他のDataFrameのように使用するための最良の方法は何ですか?.

ところで、それが役立つ場合は、SPARK 1.6 of Linux cluster on HD insightを使用しています。また、SPARK環境にまだ慣れていないので、誰かが同じコードスニペットを共有できるようにしてください。

11
Kiran

Spark 1.6:

Pythonを使用している場合は、 requests ライブラリを使用して情報を取得し、そこからRDDを作成します。 Scala(関連する thread )には、同様のライブラリが必要です。次に、次のようにします。

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

Scalaのコード:

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

これは以下からです: http://spark.Apache.org/docs/latest/sql-programming-guide.html#json-datasets

7
aggFTW

Jsonは階層構造であり、データフレームはフラットであるため、Sparkは任意のjsonをデータフレームに解析できません。 jsonがsparkによって作成されていない場合、それは condition に準拠していない可能性があります。「各行には個別の自己完結型の有効なJSONオブジェクトが含まれている必要がある」ため、カスタムを使用して解析する必要がありますコードし、ケースクラスオブジェクトのコレクションまたはspark sql Rowsとしてデータフレームにフィードします。

次のようにダウンロードできます。

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

次に、jsonを この回答に示されている として解析します。そして、あなたのケースクラスのオブジェクトのSeqを作成し(例えばseq)、次のようにデータフレームを作成します

seq.toDF
2
Ashish

ここに行きます:-spark 2.2


import org.Apache.spark.sql._
import org.Apache.hadoop.conf.Configuration
import org.Apache.hadoop.fs._
import org.Apache.http.client.methods.HttpGet
import org.Apache.http.impl.client.DefaultHttpClient
import org.Apache.spark.sql.{DataFrame, SaveMode, SparkSession}
import org.Apache.spark.sql.functions._
import org.Apache.spark.sql.types.StructType
import org.Apache.log4j.{Level, Logger}
import org.Apache.spark.rdd.RDD
import org.Apache.spark.sql.types._
import org.Apache.spark.storage.StorageLevel

object SparkRestApi {
  def main(args: Array[String]): Unit = {

    val logger = Logger.getLogger("blah")
    Logger.getLogger("org").setLevel(Level.WARN)
    Logger.getLogger("akka").setLevel(Level.WARN)

    val spark = SparkSession.builder()
      .appName("blah")
      .config("spark.sql.warehouse.dir", "C:\\Temp\\Hive")
      .master("local[2]")
      //.enableHiveSupport()
      .getOrCreate()
    import spark.implicits._

    val url = "https://api.github.com/users/hadley/orgs"
    val result2 = List(scala.io.Source.fromURL(url).mkString)
    val githubRdd2=spark.sparkContext.makeRDD(result2)
    val gitHubDF2=spark.read.json(githubRdd2)
    println(gitHubDF2)
    gitHubDF2.show()

    spark.stop()
  }
}