SCALA:从端点下载 blob 时出错:输入索引 0 处出现意外字符“<”
SCALA: Error while downloading blobs from an endpoint: Unexpected character '<' at input index 0
我正在使用 Databricks,使用 Scala 编写代码。我从 API 的端点下载 blob 文件,否则我无权访问该端点。有时我可能会收到 html 响应,这应该在我的代码中处理,但我不知道如何处理。
下载功能:
def dl: (String => String) = { fileUrl: String => {
val token = getToken();
val response: HttpResponse[String] = Http(fileUrl)
.header("Authorization", "Bearer " + token)
.asString;
try {
retry(4){
if (response.code != 200) {
throw new javax.xml.ws.http.HTTPException(response.code)
}
response.body;
}
} catch {
case e: javax.xml.ws.http.HTTPException => {
println("error HTTPException " + e + fileUrl);
"failed";
}
}
}}
在这个函数中,如果成功,我return response.body,一般情况下是一个xml文件,但有时我收到此错误,这就是为什么我认为它可能是来自端点的 html 响应:
spray.json.JsonParser$ParsingException: Unexpected character '<' at input index 0 (line 1, position 1), expected JSON Value: <html>?
此外,response.body会写入JSON文件,但错误实际上来自下载功能。
能不能帮帮我,这种情况怎么处理?
非常感谢您!!
谢谢大家的评论,对我帮助很大。错误来自我生成令牌的函数。此函数是从上面的 下载函数 调用的,它是 returns 将其解析为 JSON 后的令牌。有时会出现超时错误或未处理的异常,如我上面所述。
所以我在下载函数之外调用了token-generator函数 (getToken()) (dl()),所以不是每次调用下载函数都生成解析一个新的,而是生成一次,然后用相同的token来下载一定数量的文件。
val token = getToken();
def dl: (String => String) = { fileUrl: String => {
val response: HttpResponse[String] = Http(fileUrl)
.header("Authorization", "Bearer " + token)
.asString;
try {
retry(4){
if (response.code != 200) {
throw new javax.xml.ws.http.HTTPException(response.code)
}
response.body;
}
} catch {
case e: javax.xml.ws.http.HTTPException => {
println("error HTTPException " + e + fileUrl);
"failed" + e;
}
}
}}
另一个技巧,我将更频繁地使用它来提高性能:处理更多异常! Spark Scala 能够自行处理异常,但它有时会提高性能,如果您手动处理它。例如,在我的例子中,在 HTTPException 旁边,我添加了一个 JSON 解析器异常,因为 scala 无法处理它。
case e: spray.json.JsonParser$ParsingException => {
println("error JsonParser exception " + e );
"failed" + e;
}
通过这些修改,我改进了运行时间!之前,它是 运行 1.5 小时,有 100.000 个文件。这些更改后需要 15-20 分钟!!
我正在使用 Databricks,使用 Scala 编写代码。我从 API 的端点下载 blob 文件,否则我无权访问该端点。有时我可能会收到 html 响应,这应该在我的代码中处理,但我不知道如何处理。
下载功能:
def dl: (String => String) = { fileUrl: String => {
val token = getToken();
val response: HttpResponse[String] = Http(fileUrl)
.header("Authorization", "Bearer " + token)
.asString;
try {
retry(4){
if (response.code != 200) {
throw new javax.xml.ws.http.HTTPException(response.code)
}
response.body;
}
} catch {
case e: javax.xml.ws.http.HTTPException => {
println("error HTTPException " + e + fileUrl);
"failed";
}
}
}}
在这个函数中,如果成功,我return response.body,一般情况下是一个xml文件,但有时我收到此错误,这就是为什么我认为它可能是来自端点的 html 响应:
spray.json.JsonParser$ParsingException: Unexpected character '<' at input index 0 (line 1, position 1), expected JSON Value: <html>?
此外,response.body会写入JSON文件,但错误实际上来自下载功能。
能不能帮帮我,这种情况怎么处理?
非常感谢您!!
谢谢大家的评论,对我帮助很大。错误来自我生成令牌的函数。此函数是从上面的 下载函数 调用的,它是 returns 将其解析为 JSON 后的令牌。有时会出现超时错误或未处理的异常,如我上面所述。
所以我在下载函数之外调用了token-generator函数 (getToken()) (dl()),所以不是每次调用下载函数都生成解析一个新的,而是生成一次,然后用相同的token来下载一定数量的文件。
val token = getToken();
def dl: (String => String) = { fileUrl: String => {
val response: HttpResponse[String] = Http(fileUrl)
.header("Authorization", "Bearer " + token)
.asString;
try {
retry(4){
if (response.code != 200) {
throw new javax.xml.ws.http.HTTPException(response.code)
}
response.body;
}
} catch {
case e: javax.xml.ws.http.HTTPException => {
println("error HTTPException " + e + fileUrl);
"failed" + e;
}
}
}}
另一个技巧,我将更频繁地使用它来提高性能:处理更多异常! Spark Scala 能够自行处理异常,但它有时会提高性能,如果您手动处理它。例如,在我的例子中,在 HTTPException 旁边,我添加了一个 JSON 解析器异常,因为 scala 无法处理它。
case e: spray.json.JsonParser$ParsingException => {
println("error JsonParser exception " + e );
"failed" + e;
}
通过这些修改,我改进了运行时间!之前,它是 运行 1.5 小时,有 100.000 个文件。这些更改后需要 15-20 分钟!!