我创建了一个解析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
答案 0 :(得分:0)
我了解到=
和&
正在被转换为它们的Unicode等价物。为什么发生这种情况对我来说仍然不清楚。使用Apache Commons StringEscapeUtils实用程序,问题变得更加容易:
StringEscapeUtils.unescapeJava(requestInput.toString())
解决了这个问题。