Hive UDF 对 URL 的处理

Hive UDF's treatment of URLs

我创建了一个解析 URL 的 Hive UDF。 URL 包含查询参数。然而,当我在我的 UDF 中解析输入时,像“=”和“&”这样的字符被转换为乱码。

最初,我依靠 String 的 toString() 方法将 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

}

当我在 Hive 中 运行 HQL 时:

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

我明白了:

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

在我的 UDF 中,toString() 方法(无额外处理)产生以下输出:

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

我了解到 =& 正在转换为它们的 Unicode 等价物。我仍然不清楚为什么会这样。使用 Apache Commons StringEscapeUtils 实用程序,问题变得更简单:

StringEscapeUtils.unescapeJava(requestInput.toString()) 

解决了问题。