SCALA:从端点下载Blob时出错:输入索引0处出现意外字符'<'

时间:2019-05-16 09:34:58

标签: scala download blob databricks

我正在使用 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文件,但是错误实际上来自下载功能。

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

非常感谢您!

1 个答案:

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