Hadoop Hive 按类别分组

Posted

技术标签:

【中文标题】Hadoop Hive 按类别分组【英文标题】:Hadoop Hive Group by with category 【发布时间】:2014-04-24 19:03:39 【问题描述】:

伙计们,

我们对 Hadoop Hive 有一个要求。

基本上我们有以下格式的数据。

客户名称、产品名称、价格

Test,prod1,10
Test,prod2,30
Test,prod3,20


Test1,prod1,20
Test1,prod2,30
Test1,prod2,30


 Test2,prod1,50
 Test2,prod2,40
 Test2,prod2,10

我们需要从上面找到前2名的客户[条件(他们的产品总和的价格落入前2名]

例如,在上面的示例中,我们需要 Test1 sum(price) = 20+30+30 = 80 的记录 Test2 sum(price) = 50+40+10 = 100

测试客户不符合条件,价格总和为 60。

基本上是前 2 位客户的客户及其产品列表(如果 sum(price) 更多,则他们有资格)

预期输出。 (测试客户的记录不应该来)

 Test1,prod1,20
 Test1,prod2,30
 Test1,prod2,30


 Test2,prod1,50
 Test2,prod2,40
 Test2,prod2,10

如何为此编写 HIVE 查询。

【问题讨论】:

【参考方案1】:

我不确定你有什么 hive 版本,但我会假设我们不能使用 IN()

您需要创建一个临时表来保存匹配的客户。

CREATE TABLE tempp 
    AS SELECT customer, sum(price) as v 
          FROM mytable group by customer ORDER BY v DESC LIMIT 2;

此临时表将包含以下行:

Test2   100.0
Test1   80.0

然后做一个 LEFT SEMI JOIN 得到匹配的

SELECT a.* FROM mytable a LEFT SEMI JOIN tempp t ON (a.customer = t.customer)

基于您的表格的输出:

Test1   prod1   20
Test1   prod2   30
Test1   prod2   30
Test2   prod1   50
Test2   prod2   40
Test2   prod2   10

【讨论】:

嗨,有什么方法可以在单个查询中完成,而无需创建临时表。因为如果数据经常更新,我们可能不得不每次都创建临时表,这并不理想。我正在使用 Hive 0.11 尝试查看 hive 子查询,并在第二个查询中创建临时表。

以上是关于Hadoop Hive 按类别分组的主要内容,如果未能解决你的问题,请参考以下文章

迭代meteorjs中嵌套的每个语句(按类别分组)

hive hql怎么按两个字段同时分组统计

在每月档案中按类别对帖子进行分组

为每个类别分配最小值和最大值,而不按类别分组

Oracle - 按类别分组,日期范围[重复]

如何按 ID 分组并获取每个类别的计数