Hadoop 配置单元:指定组的总和(HiveQL)

Hadoop 配置单元:指定组的总和(HiveQL),hadoop,hive,hiveql,hortonworks-data-platform,Hadoop,Hive,Hiveql,Hortonworks Data Platform,我有一张桌子: key product_code cost 1 UK 20 1 US 10 1 EU 5 2 UK 3 2 EU 6 我想找到每组“键”的所有乘积之和,并附加到每一行。例如,对于key=1,找到所有产品的成本总和(20+10+5=35),然后将结果附加到key=1对应的所有行。因此,最终结

我有一张桌子:

key    product_code    cost
1      UK              20
1      US              10
1      EU              5
2      UK              3
2      EU              6
我想找到每组“键”的所有乘积之和,并附加到每一行。例如,对于key=1,找到所有产品的成本总和(20+10+5=35),然后将结果附加到key=1对应的所有行。因此,最终结果:

key    product_code    cost     total_costs
1      UK              20       35
1      US              10       35
1      EU              5        35
2      UK              3        9
2      EU              6        9
我更愿意在不使用子联接的情况下执行此操作,因为这样会效率低下。我最好的办法是将
over
函数与
sum
函数结合使用,但我无法让它工作。我的最佳尝试:

SELECT key, product_code, sum(costs) over(PARTITION BY key)
FROM test
GROUP BY key, product_code;

我看了一下,但是那里太神秘了,我不知道该怎么做。Im使用Hive v0.12.0、HDP v2.0.6、HortonWorks Hadoop发行版。

分析函数sum提供累计总和。例如,如果您这样做了:

select key, product_code, cost, sum(cost) over (partition by key) as total_costs from test
然后你会得到:

key    product_code    cost     total_costs
1      UK              20       20
1      US              10       30
1      EU              5        35
2      UK              3        3
2      EU              6        9
这似乎不是你想要的

相反,您应该使用聚合函数sum,并结合自连接来完成以下操作:

select test.key, test.product_code, test.cost, agg.total_cost
from (
  select key, sum(cost) as total_cost
  from test
  group by key
) agg
join test
on agg.key = test.key;

您可以在无界的前一行和当前行之间使用
来实现这一点,而无需自联接

代码如下:

SELECT a, SUM(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM T;

与@VB_uu.answer类似,在无界前导和无界后导之间使用

因此,HiveQL查询是:

SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM test;

上面的桌子看起来像

key    product_code    cost
1      UK              20
1      US              10
1      EU              5
2      UK              3
2      EU              6
用户想要一个总成本如下的标签

key    product_code    cost     total_costs
1      UK              20       35
1      US              10       35
1      EU              5        35
2      UK              3        9
2      EU              6        9
因此,我们使用了以下查询

SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM test;
SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as total_costs
COUNT(product code) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as occurences
FROM test;
到目前为止还不错。 我还要一个专栏,统计每个国家发生的事件

key    product_code    cost     total_costs     occurences
1      UK              20       35              2
1      US              10       35              1
1      EU              5        35              2
2      UK              3        9               2
2      EU              6        9               2
因此,我使用了以下查询

SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM test;
SELECT key, product_code,
SUM(costs) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as total_costs
COUNT(product code) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as occurences
FROM test;
遗憾的是,这不起作用。我犯了一个神秘的错误。为了排除查询中的错误,我想问一下我是否做错了什么。
谢谢

这个查询给了我完美的结果

选择key、product\u code、cost、sum(cost)over(按key划分)作为分区的总成本

类似的答案(如果我们使用oracle emp表):

从emp中选择deptno、ename、sal、sum(sal)over(按deptno划分)

输出如下所示:

deptno  ename   sal sum_window_0
10  MILLER  1300    8750
10  KING    5000    8750
10  CLARK   2450    8750
20  SCOTT   3000    10875
20  FORD    3000    10875
20  ADAMS   1100    10875
20  JONES   2975    10875
20  SMITH   800     10875
30  BLAKE   2850    9400
30  MARTIN  1250    9400
30  ALLEN   1600    9400
30  WARD    1250    9400
30  TURNER  1500    9400
30  JAMES   950     9400

您的最佳尝试有什么问题?@fmx它只是给出了一个语法错误。我一定是用错了over函数,有没有不使用自连接的方法呢?差不多了!这总计为当前行。我现在意识到,您需要在无界的前向语句和无界的后向语句之间进行排序。虽然非常旧,但COUNT(产品代码)应该是COUNT(产品代码)。此外,我正在运行Hive-0.13,我可以通过执行以下查询select key、product_code、cost、sum(成本)over(按键划分)、COUNT来获得所需的结果(product_code)over(partition by product_code)作为prod_key中的p_code_计数;我认为HiveSQL没有此功能。这是oracle sql吗?我从该表获取数据,在hive中创建了一个表。(apache-hive-1.2.1)我在hive中尝试了上述查询(也许您可以尝试相同的查询)。相同的输出被复制粘贴到这里。