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 的处理的主要内容,如果未能解决你的问题,请参考以下文章

处理 hive udf 中的多行

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示

Hive UDF 在 Scala 中处理整数数组

Hive函数(UDF篇)

hive 的udf 函数使用

Hive - 在 Python UDF 中处理 NULL 输入值