SCALA: ошибка при загрузке больших двоичных объектов из конечной точки: неожиданный символ '<' при входном индексе 0 - PullRequest
1 голос
/ 16 мая 2019

Я использую Базы данных , пишу код с Scala . Я загружаю файлы BLOB-объектов из конечной точки API, к которой у меня нет доступа в противном случае. Иногда я могу получить 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 голосов
/ 27 мая 2019

Спасибо за все комментарии, это на самом деле мне очень помогло.Ошибка исходила от функции, где я генерирую токен.Эта функция вызывается из функции загрузки , описанной выше, и возвращает токен после анализа его как JSON.Иногда были ошибки тайм-аута или необработанное исключение, о которых я говорил выше.

Поэтому я вызываю функцию генератора токенов ( getToken () ) вне функция загрузки ( dl () ), поэтому вместо того, чтобы генерировать и анализировать новый, каждый раз, когда мы вызываем функцию загрузки, он генерируется один раз, а затем использует тот же токен длязагрузить количество файлов.

    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 минут !!

...