Hive UDF обрабатывает URL-адреса

Я создал пользовательскую функцию Hive, которая анализирует URL-адрес. URL-адрес содержит параметры запроса. Однако, когда я анализирую ввод в своей пользовательской функции, такие символы, как «=» и «&», преобразуются в тарабарщину.

Первоначально я полагался на метод toString() String для преобразования Hive Text в Java String. При таком подходе приведенные выше символы преобразуются в тарабарщину. Затем я попытался использовать new String(str, StandardCharsets.UTF_8) для преобразования Hive Text в Java String. Сначала это работало. Затем он также начал производить тарабарщину.

Мой метод показан ниже. Любые идеи о том, что я могу делать не так?

public Text evaluate(final Text requestInput, final Text referrerInput) {
    if (requestInput == null || referrerInput == null)
        return null;

    final String request = new String(requestInput.getBytes(), StandardCharsets.UTF_8); // converts '=' and '&' in URL strings to gibberish
    final String referrer = new String(referrerInput.getBytes(), StandardCharsets.UTF_8); // converts '=' and '&' in URL strings to gibberish

}

Когда я запускаю HQL в Hive:

SELECT get_json_object(json, '$.base.request_url') FROM events

Я получаю это:

GET /api/get_info?id=1465473313746 HTTP/1.1

В моей пользовательской функции метод toString() (без дополнительной обработки) выдает следующий результат:

GET /api/get_info?id\u003d1465473313746 HTTP/1.1


person okello    schedule 19.06.2016    source источник
comment
почему бы просто не использовать parse_url или parse_url_tuple UDF? Кроме того, вы не говорите, что должен делать ваш UDF. Кроме того, вы делаете неправильно преобразование текста в строку. У текста есть метод .toString, вы должны использовать его. Вместо этого вы получаете байты из текста и создаете строку, заставляющую использовать кодировку UTF-8, но текст на самом деле может не быть UTF-8.   -  person Roberto Congiu    schedule 19.06.2016
comment
Моя теория заключалась в том, что проблема, которую я описал выше, вызвана разными кодировками символов. Итак, я пытаюсь использовать подход, который позволяет мне указать кодировку символов. Я где-то читал, что Hive всегда использует UTF-8. Вот почему я указал это. Я выбираю поле JSON, в котором есть записи, содержащие веб-URL-адреса. Я хочу манипулировать этим JSON в своем UDF. Однако при доступе к нему в моей UDF с использованием toString() или описанного выше подхода я получаю тарабарщину для символов = и &.   -  person okello    schedule 20.06.2016
comment
Невозможно сказать, что не так, не глядя на JSON и на то, как была создана таблица. Конечно, это не вина UDF. Кроме того, вы говорите, что получаете «тарабарщину» в качестве вывода, но то, что вам кажется тарабарщиной, на самом деле может дать намек на то, что не так, поэтому вы должны показать это тоже.   -  person Roberto Congiu    schedule 20.06.2016
comment
не могли бы вы опубликовать пример ввода и вывода? так что я могу попытаться помочь вам.   -  person Ranjith Sekar    schedule 20.06.2016
comment
Я обновил вопрос, указав образец вывода Hive и то, как он искажен в моем UDF. В частности, = и & имеют неверный формат; остальное остается нормально.   -  person okello    schedule 21.06.2016
comment
Я узнал, что это эквиваленты Unicode этих символов. Я все еще изучаю, как я могу предотвратить это. В то же время, любая помощь будет оценена по достоинству.   -  person okello    schedule 21.06.2016
comment
Я нашел решение. Узнав, что это было преобразование в Unicode, проблема стала относительно простой, поскольку теперь я мог использовать StringEscapeUtils Apache Commons для получения чистой строки. Тем не менее, большое спасибо за вашу помощь.   -  person okello    schedule 21.06.2016


Ответы (1)


Я узнал, что = и & были преобразованы в их эквиваленты Unicode. Почему это происходило, мне до сих пор непонятно. Использование Apache Commons StringEscapeUtils, проблема стала проще:

StringEscapeUtils.unescapeJava(requestInput.toString()) 

решил проблему.

person okello    schedule 21.06.2016