scala - SCALA:从端点下载 blob 时出错:输入索引 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";
}
}
}}
在这个函数中,如果成功,我会返回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 文件,但错误实际上来自下载函数。
你能帮我吗,如何处理这种情况?
非常感谢您提前!!
解决方案
谢谢大家的评论,其实对我帮助很大。错误来自我生成令牌的函数。这个函数是从上面的下载函数中调用的,它解析为JSON后返回token。有时会出现我上面提到的超时错误或未处理的异常。
所以我在下载函数(dl())之外调用令牌生成器函数(getToken()),所以每次调用下载函数时都生成并解析一个新的,而不是生成一次,然后使用相同的令牌来下载大量文件。
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 分钟!
推荐阅读
- angular - 如何编写像material.angular.io这样的sidenav
- c# - 模拟动作委托属性
- ag-grid - 无法更改行高
- python - 我不明白安装了什么版本的 CUDA。`nvidia-smi` 和 `nvcc` 命令返回不兼容的信息
- excel - 当按下 F9 并有一个按钮来计算这两张纸时,如何从计算中排除两张纸?
- python - 如何在 Python 中使用 Pillow 库向 PNG 图像添加轮廓/描边/边框?
- python - 是否有任何快速公式可以找到由 N 个点给出的一般四边形(六面体)的最大面积?
- css - mdc-select 呈现在一切之上
- matlab - 使用 MATLAB 曲线拟合提取函数与时间的不同值
- json - 为什么我在尝试编写 homebridge 时会收到此 json 语法错误?