如何使用 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如果我是对的,并且 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(附源码)