首页 > 解决方案 > 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 文件,但错误实际上来自下载函数。

你能帮我吗,如何处理这种情况?

非常感谢您提前!!

标签: scaladownloadblobdatabricks

解决方案


谢谢大家的评论,其实对我帮助很大。错误来自我生成令牌的函数。这个函数是从上面的下载函数中调用的,它解析为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 分钟!


推荐阅读