【问题标题】:How to Write UDAF function for Hive using Java如何使用 Java 为 Hive 编写 UDAF 函数
【发布时间】: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,这很简单,但我找不到实施所需的信息

标签: java hive user-defined-functions user-agent


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多