在 Spark 中调用 elocation geocode API returns 为空
Calling elocation geocode API returns empty in Spark
我在通过 Spark 调用 eLocations 地理编码 API 时遇到了这个奇怪的问题,即使在我知道 return 坐标的地址上,我也总是会得到一个空体。我正在使用 Spark (2.3.3) 和 scala 开发地理编码应用程序。我还使用 scalaj 来调用 REST API。所以调用 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_host =(代理ip)
- proxy_port =(端口号)
- 要求=
"<?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>"
- response_format = JSON
因此,当我在 Spark 中 运行 我的应用程序时,它总是 [{}](即空 JSON 数组)。当我 运行 没有 spark-submit 的相同请求时,我将得到一个适当的 JSON 对象数组(例如 java -jar test.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
请帮忙,我不知道去哪里解决这个问题,因为我以前从未遇到过。
好的,找到原因了。负载实际上是空的,这就是为什么 elocation 一直返回空白。
今天的课程,检查你的负载。
我在通过 Spark 调用 eLocations 地理编码 API 时遇到了这个奇怪的问题,即使在我知道 return 坐标的地址上,我也总是会得到一个空体。我正在使用 Spark (2.3.3) 和 scala 开发地理编码应用程序。我还使用 scalaj 来调用 REST API。所以调用 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_host =(代理ip)
- proxy_port =(端口号)
- 要求=
"<?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>"
- response_format = JSON
因此,当我在 Spark 中 运行 我的应用程序时,它总是 [{}](即空 JSON 数组)。当我 运行 没有 spark-submit 的相同请求时,我将得到一个适当的 JSON 对象数组(例如 java -jar test.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
请帮忙,我不知道去哪里解决这个问题,因为我以前从未遇到过。
好的,找到原因了。负载实际上是空的,这就是为什么 elocation 一直返回空白。
今天的课程,检查你的负载。