【发布时间】: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 中的格式错误。具体来说,
=和&格式不正确;其余的都很好。