使用Scala Spark从URL获取结果

使用Scala Spark从URL获取结果,scala,rest,apache-spark,Scala,Rest,Apache Spark,因此,我对Scala非常陌生,我正试图弄清楚如何调用Web服务并在Json对象中返回响应。我遇到了各种各样的问题。可能是因为我犯了一个错误。但是我被卡住了,也许有人能帮我 通过一些搜索,我发现我可以定义一个函数来调用API(实际上我只是找到了调用方法代码并为它定义了一个函数) 所以我调用这个函数,将响应转换成文本 val response: String = GetUrlContent(url).toString() 我知道有点多余,但我什么都试过了。但在这里我遇到了问题。 我试图将整个数据转

因此,我对Scala非常陌生,我正试图弄清楚如何调用Web服务并在Json对象中返回响应。我遇到了各种各样的问题。可能是因为我犯了一个错误。但是我被卡住了,也许有人能帮我

通过一些搜索,我发现我可以定义一个函数来调用API(实际上我只是找到了调用方法代码并为它定义了一个函数)

所以我调用这个函数,将响应转换成文本

val response: String = GetUrlContent(url).toString()
我知道有点多余,但我什么都试过了。但在这里我遇到了问题。 我试图将整个数据转换成一个字符串RDD,这样我就可以查找特定的行(因为我是新手,还不能将数据映射到Json)。我用了这句话:

 response.reduce((x,y) => x + y)
然而,这就产生了错误: 错误:(22,30)类型不匹配; 找到:Int 必需:字符 响应减少((x,y)=>x+y)

我试着将x和y转换为Char,但这不起作用。就像我说的,我可能跳过了一些东西。有人能解释一下为什么我得到的是一个字符数组,而不是一个行的字符串数组(就像读取文件一样)? 而且,我们欢迎提供示例或解决方案

提前谢谢!
托马斯

好吧,我觉得我在这方面花的时间太长了,不过我对Spark&Scala了解了很多,所以这是值得的。每个人都在寻找一种简单的方法来发布一个调用并获得一个Json数据帧作为响应,我最终实现了这个函数,它适合我。希望这能进一步帮助你们

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

您是否找到了一种不首先将其保存到rdd而直接获取它的方法?
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