Hive UDF 对 URL 的处理
Posted
技术标签:
【中文标题】Hive UDF 对 URL 的处理【英文标题】:Hive UDF's treatment of URLs 【发布时间】:2016-06-19 15:23:03 【问题描述】:我创建了一个解析 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
【问题讨论】:
为什么不直接使用 parse_url 或 parse_url_tuple UDF 呢?此外,您并没有说您的 UDF 应该做什么。另外,您做错的是将文本转换为字符串。 Text 有一个 .toString 方法,你应该使用它。相反,您从 Text 中获取字节并创建一个强制 UTF-8 编码的字符串,但 Text 实际上可能不是 UTF-8。 我的理论是我上面描述的问题是由不同的字符编码引起的。所以,我正在尝试使用一种允许我指定字符编码的方法。我在某处读到 Hive 总是使用UTF-8
。这就是我指定它的原因。我正在选择一个 JSON 字段,该字段恰好包含包含 Web URL 的条目。我想在我的 UDF 中操作这个 JSON。但是,在我的 UDF 中使用 toString()
或上述方法访问它时,=
和 &
字符出现乱码。
如果不查看 JSON 以及表是如何创建的,就无法判断出了什么问题。当然,这不是 UDF 的错。此外,您说您得到“胡言乱语”作为输出,但在您看来胡言乱语的内容实际上可能会提示您出了什么问题,因此您也应该显示出来。
您能发布示例输入和输出吗?这样我就可以尽力帮助你了。
我已经用一个示例 Hive 输出更新了这个问题,以及我的 UDF 中的格式错误。具体来说,=
和 &
格式不正确;其余的都很好。
【参考方案1】:
我了解到=
和&
正在转换为它们的Unicode 等价物。为什么会发生这种情况我仍然不清楚。使用Apache Commons StringEscapeUtils 实用程序,问题变得更简单了:
StringEscapeUtils.unescapeJava(requestInput.toString())
解决了这个问题。
【讨论】:
以上是关于Hive UDF 对 URL 的处理的主要内容,如果未能解决你的问题,请参考以下文章