Hive UDF对URL的处理

时间:2016-06-19 15:23:04

标签: java hadoop hive udf

我创建了一个解析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

1 个答案:

答案 0 :(得分:0)

我了解到=&正在被转换为它们的Unicode等价物。为什么发生这种情况对我来说仍然不清楚。使用Apache Commons StringEscapeUtils实用程序,问题变得更加容易:

StringEscapeUtils.unescapeJava(requestInput.toString()) 

解决了这个问题。