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 分钟!!