如何使用 Java 为 Hive 编写 UDAF 函数

Posted

技术标签:

【中文标题】如何使用 Java 为 Hive 编写 UDAF 函数【英文标题】:How to Write UDAF function for Hive using Java 【发布时间】:2018-01-05 14:09:43 【问题描述】:

我有一个包含列的 Hive 表“log_data”:

“User_Agent”(User_Agent 示例:“Mozilla/5.0(兼容;Googlebot/2.​​1;+http://www.google.com/bot.html)”)和列城市

我应该写 UDAF 函数parsed_user_agent 使用如下 -

SELECT city, parsed_user_agent(User_Agent) group by city

在结果中,我应该从 User_Agent(操作系统、浏览器和设备)获取每个城市的信息。

具体来说,我应该使用由 AbstractGenericUDAFResolver.class 扩展的类。

问题。我不知道如何实现这个逻辑,但我知道如何解析用户代理,我不知道如何处理输入(字符串用户代理)和输出(操作系统、浏览器和设备的结构)。

【问题讨论】:

你能把你的代码贴在这里吗? 真的,我没有代码实现,因为我不知道如何使用输入(用户代理)和输出(操作系统、浏览器、设备)。我只知道如何解析用户代理。但是我的实现例子很少,但是很容易。它只有一个输出参数blog.dataiku.com/2013/05/01/… 两天之内我也将练习使用hive函数为UDAF创建jar。 我认为我应该创建三张地图。 Map 一个用于浏览器的地图 第二个用于 OS 第三个用于设备。键 - (操作系统、设备、浏览器)的名称 值 - 在城市中使用的计数。最后我得到了最大价值的钥匙 @ArifMustafa,这很简单,但我找不到实施所需的信息 【参考方案1】:

如果我是对的,并且 user_agent 始终具有相同的结构,为什么不使用 regexp_extract?

例如

select regexp_extract('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', '(\\S*).*', 1)

【讨论】:

为了解析,我将使用 API github.com/HaraldWalker/user-agent-utils 但问题不在于解析,我需要创建 UDAF jar。这给了我每个城市最流行的数据(操作系统、设备、浏览器) @ПавелОрлов 您不应该将获取每个城市最流行(...)的功能放在 UDF 中,而只是解析。之后你可以只用 SQL(分组、计数、排名等)得到最受欢迎的东西 他是对的。你必须这样做: select * FROM ( select city, device, browser, numbers, row_number() over (partition by city order by numbers desc) rowNo from (SELECT city, device, browser, count(*) numbers FROM your_table GROUP BY city, device,browser ) x ) xx where rowNo = 1

以上是关于如何使用 Java 为 Hive 编写 UDAF 函数的主要内容,如果未能解决你的问题,请参考以下文章

Hive UDAF:将非 Java Hive UDAF 的输出转换为地图

用java编写的hive udf、udaf、udtfs如何在eclipse之类的ide中调试?

浅析 hive udaf 的正确编写方式- 论姿势的重要性-系列四-如何直接访问metastore service(附源码)

浅析 hive udaf 的正确编写方式- 论姿势的重要性

Hive中自定义UDAF函数生产小案例

hive UDAF