我正在使用 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";
}
}
}}
在此函数中,如果成功,我将返回 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文件,但是错误实际上来自下载功能。
您能帮我如何处理这种情况吗?
非常感谢您!
答案 0 :(得分:0)
感谢您的所有评论,它实际上对我有很大帮助。错误来自于函数,在该函数中生成令牌。从上面的 download函数调用此函数,它将令牌解析为JSON后返回令牌。有时候,我在上面提到了超时错误或未处理的异常。
因此,我在下载功能( dl()<之外)中调用令牌生成器功能( getToken()) / em>),因此,每次调用下载功能时,它不会生成并解析一个新文件,而是会生成一次,然后使用相同的令牌来下载一定数量的文件。
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分钟!