我需要从提供REST接口的Web服务中读取一些JSON数据,以便从我的SPARK SQL代码中查询数据以进行分析。我能够读取存储在blob存储中的JSON并使用它。
我想知道从REST服务读取数据的最佳方法是什么,并像其他任何DataFrame
一样使用它。
BTW如果有帮助,我正在使用SPARK 1.6 of Linux cluster on HD insight
。如果有人可以共享任何代码片段,我也会很感激,因为我对SPARK环境仍然很新。
答案 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()
}
}