web-dev-qa-db-ja.com

Hive:指定したグループの合計(HiveQL)

テーブルがあります:

key    product_code    cost
1      UK              20
1      US              10
1      EU              5
2      UK              3
2      EU              6

「キー」の各グループのすべての製品の合計を見つけて、各行に追加したいと思います。たとえば、キー= 1の場合、すべての製品のコストの合計(20 + 10 + 5 = 35)を見つけ、キー= 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;

Ivは docs を調べましたが、非常に不可解なので、それを行う方法を理解する方法がわかりません。私はHive v0.12.0、HDP v2.0.6、HortonWorks Hadoopディストリビューションを使用しています。

8
joshlk

@VB_と同様に、BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGステートメント

したがって、HiveQLクエリは次のとおりです。

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

BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWは、自己結合なしでそれを実現します。

以下のコード:

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

分析関数の合計は、累積合計を提供します。たとえば、次の場合:

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;
2
Joe K

このクエリは私に完璧な結果を与えます

select key, product_code, cost, sum(cost) over (partition by key) as total_costs from zone;

1
Ashish Mohan

上の表は次のようでした

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;

ここまでは順調ですね。各国の出来事を数え、コラムをもっと欲しい

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) as total_costs
COUNT(product code) OVER (PARTITION BY key ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as occurences
FROM test;

悲しいことに、これは機能していません。不可解なエラーが発生します。クエリのエラーを除外するには、何か間違ったことをしたかどうかを確認します。ありがとう

1
Peter

同様の答え(Oracle empテーブルを使用する場合):

select deptno, ename, sal, sum(sal) over(partition by deptno) from emp;

出力は以下のようになります:

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
0
Pala