scala调用elocation geocodeapi在spark中返回空

2sbarzqh  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(428)

在通过spark调用elocations地理编码api时,我遇到了一个奇怪的问题,即使在我知道会返回坐标的地址上,我也总是会得到一个空的主体。我正在使用spark(2.3.3)和scala开发一个地理编码应用程序。我还使用scalaj调用restapi。因此调用api的代码行如下:

def getGeoCoderLocation(sc: SparkSession, req: String, url: String, proxy_host: String, proxy_port: String, response_format: String): scala.collection.Map[String, (String, String)] = {
    import sc.implicits._

    val httpresponse = Http(url).proxy(proxy_host, proxy_port.toInt).postForm.params(("xml_request", req), ("format", response_format)).asString

    println(httpresponse.body)
    println(httpresponse.contentType.getOrElse(""))
    println(httpresponse.headers)
    println(httpresponse)
    if(!httpresponse.contentType.getOrElse("").contains("text/html")) {
      val body = httpresponse.body
      val httpresponse_body = parseJSON(Option(body).getOrElse("[{\"x\":, \"y\":}]"))

      val location = for (it <- 0 until httpresponse_body.length) yield {
        (Option(httpresponse_body(it)(0).x).getOrElse("").toString, Option(httpresponse_body(it)(0).y).getOrElse("").toString, it)
      }

      val locDF = location.toDF(Seq("LONGITUDE", "LATITUDE", "row"): _*)//.withColumn("row", monotonically_increasing_id())
      locDF.show(20, false)
      locDF.rdd.map { r => (Option(r.get(2)).getOrElse("").toString, (Option(r.get(0)).getOrElse("").toString, Option(r.getString(1)).getOrElse("").toString)) }.collectAsMap()
    }
    else {
      val locDF = Seq(("","","-")).toDF(Seq("LONGITUDE", "LATITUDE", "row"): _*)//.withColumn("row", monotonically_increasing_id())
      locDF.show(20, false)
      locDF.rdd.map { r => (Option(r.get(2)).getOrElse("").toString, (Option(r.get(0)).getOrElse("").toString, Option(r.getString(1)).getOrElse("").toString)) }.collectAsMap()
    }
  }

哪里
url=http://elocation.oracle.com/elocation/lbs
proxy\u host=(代理的ip)
代理端口=(端口号)
需求= "<?xml version=\"1.0\" standalone=\"yes\"?>\n<geocode_request vendor=\"elocation\">\n\t(address_list)\n\t\t|<list of requests>|\n\t</address_list>\n</geocode_request>" 响应格式=json
因此,当我在spark中运行我的应用程序时,当我打印主体时,它将始终是[{}](即空json数组)。当我运行相同的请求而不使用spark submit时,我将得到一个适当的json对象数组(例如java-jartest.jar)。
spark中是否有阻止应用程序接收rest响应的设置?我们使用的是cloudera 5.16.x
我还尝试使用设置代理信息 --conf "spark.executor.extraJavaOptions=-Dhttp.proxyHost=(ip) -Dhttp.proxyPort=(port) -Dhttps.proxyHost=(ip) -Dhttps.proxyPort=(port)" 但我会得到:

Exception in thread "main" org.apache.hadoop.security.KerberosAuthException: Login failure for user: (principal) from keytab (keytab) javax.security.auth.login.LoginException: Cannot locate KDC

请帮助,因为我不知道在哪里寻找解决这个问题,因为我从来没有遇到过这个。

ar7v8xwq

ar7v8xwq1#

好的,找到原因了。有效载荷实际上是空的,这就是为什么elocation一直返回空白。
今天的课,检查你的有效载荷。

相关问题