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())
解决了问题。
我创建了一个解析 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())
解决了问题。