Spark SQL:如何将REST服务中的json数据作为DataFrame使用

时间:2016-05-09 10:06:52

标签: apache-spark-sql spark-dataframe hdinsight

我需要从提供REST接口的Web服务中读取一些JSON数据,以便从我的SPARK SQL代码中查询数据以进行分析。我能够读取存储在blob存储中的JSON并使用它。

我想知道从REST服务读取数据的最佳方法是什么,并像其他任何DataFrame一样使用它。

BTW如果有帮助,我正在使用SPARK 1.6 of Linux cluster on HD insight。如果有人可以共享任何代码片段,我也会很感激,因为我对SPARK环境仍然很新。

3 个答案:

答案 0 :(得分:6)

On 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

答案 1 :(得分:1)

Spark无法将任意json解析为数据帧,因为json是层次结构,而数据帧是平面的。如果你的json不是由spark创建的,那么很可能它不符合condition“每行必须包含一个单独的,自包含的有效JSON对象”,因此需要使用自定义代码进行解析然后作为case-class对象或spark sql Rows的集合提供给dataframe。

您可以下载:

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

然后将您的json解析为shown in this answer。然后创建一个案例类的Seq对象(比如seq)并创建一个数据框作为

seq.toDF

答案 2 :(得分:1)

您要去的地方:-火花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()
  }
}