Tho*_*lto 0 rest scala apache-spark
所以我对 Scala 真的很陌生,我试图弄清楚如何调用 Web 服务并在 Json 对象中获取响应。我遇到了各种各样的问题。可能是因为我犯了一个错误。但是我被卡住了,所以也许有人可以帮助我。
经过一番搜索发现可以定义一个函数来调用API(其实我只是找到了调用方法的代码,并为它定义了一个函数)
def GetUrlContent(url: String): String ={
val result = scala.io.Source.fromURL(url).mkString
return result.toString()
}
Run Code Online (Sandbox Code Playgroud)
所以我调用这个函数,并将响应转换为文本。
val response: String = GetUrlContent(url).toString()
Run Code Online (Sandbox Code Playgroud)
我知道有点多余,但我尝试了一切。但在这里我遇到了问题。我试图将整个数据放入一个字符串 RDD 中,这样我就可以查找特定的行(因为我真的很新,还不能将数据映射到 Json)。我用了这个语句:
response.reduce((x,y) => x + y)
Run Code Online (Sandbox Code Playgroud)
然而,这给出了错误:Error:(22, 30) type mismatch; found : Int required: Char response.reduce((x,y) => x + y)
我尝试将 x 和 y 转换为 Char,但这不起作用。所以正如我所说,我可能跳过了一些东西。谁能向我解释为什么我得到一个 Char 数组而不是一个 String 行数组(就像读取文件时那样)?示例或解决方案总是受欢迎的。
提前致谢!托马斯
好的,所以我觉得我在这上面花了太长时间,但是我学到了很多关于 Spark 和 Scala 的知识,所以这是值得的。对于每个人都在寻找一种简单的方法来发布呼叫并获得 Json DataFrame 作为响应,我最终制作了这个功能,它对我有用。希望这能帮助你们进一步。
import org.apache.spark.sql.{DataFrame, SQLContext, SparkSession}
def GetUrlContentJson(url: String): DataFrame ={
val result = scala.io.Source.fromURL(url).mkString
//only one line inputs are accepted. (I tested it with a complex Json and it worked)
val jsonResponseOneLine = result.toString().stripLineEnd
//You need an RDD to read it with spark.read.json! This took me some time. However it seems obvious now
val jsonRdd = spark.sparkContext.parallelize(jsonResponseOneLine :: Nil)
val jsonDf = spark.read.json(jsonRdd)
return jsonDf
}
val response = GetUrlContentJson(url)
response.show
Run Code Online (Sandbox Code Playgroud)