ハイブでロールアップとキューブを使用する方法

ビジネスシーン:

        ストア テーブル dim_mty_store の 3 つのフィールドは、store_code (ストア)、director_code (ディレクター)、manager_code (リージョン) で、レベルは小さいものから大きいものまで、ストア < ディレクター < リージョンです。

店舗、ディレクター、地域の 3 つの粒度に従って店舗数をカウントするには、最も愚かな方法は、3 回グループ化してからすべてを結合することです。コードは次のとおりです。

-- 1. 门店
select
    manager_code,
    director_code,
	store_code,
    count(store_code) as cnt
from dim_mty_store
group by 
    manager_code,
    director_code,
    store_code
	
union all
-- 2. 主任
select
    manager_code,
    director_code,
	null as store_code,
    count(store_code) as cnt
from dim_mty_store
group by 
    manager_code,
    director_code
	
union all
-- 3. 大区
select
    manager_code,
    null as director_code,
	null as store_code,
    count(store_code) as cnt 
from dim_mty_store
group by 
    manager_code
;

関連するショートカット メソッドは次のとおりです。

1.立方体

機能: すべてのフィールドの組み合わせの可能な組み合わせに従って、union all の結果をグループ化します。

実行順序: 最初に完全なセットを実行し、次にサブセットを (左から右に) 実行し、最後に空のセットを実行します。

grouping__id : グループ化フィールドの組み合わせに対応する ID。0 から始まり、完全なセットは 0、最大値は空のセットが空の場合です。

栗をあげます:

-- cube
set odps.sql.hive.compatible=true; --输出grouping__id时才需要该设置
select
    store_code,
    director_code,
    manager_code,
    grouping__id,
    count(store_code) as cnt
from dim_mty_store
group by 
    manager_code,
    director_code,
    store_code
    with cube
;

-- 底层执行的逻辑等同于下面这段逻辑,共8组,这里只写group by部分
-- 1、全集,grouping__id = 0
group by 
    manager_code,
    director_code,
    store_code


-- 2、所有子集,这里共有6组,两两组合3组,单个字段3组     
union all
group by 
    manager_code,
    director_code              -- grouping__id = 1
  
union all
group by 
    manager_code,
    store_code                -- grouping__id = 2

union all
group by 
    manager_code                -- grouping__id = 3

union all
group by 
    director_code,
    store_code                    -- grouping__id = 4

union all
group by 
    director_code                -- grouping__id = 5

union all
group by 
    store_code                     -- grouping__id = 6

-- 3、空集,用111代替
union all
group by 111                        -- grouping__id = 7

2.ロールアップ:

機能: 立方体のサブセット。

実行順序: 最初に完全なセットを実行し、次に左端のフィールドを含むサブセットを左から右に実行し (フィールドの数は減少します)、最後に空のセットを実行します。

grouping__id : グループ化フィールドの組み合わせに対応する ID。0 から始まり、完全なセットは 0 で、最大値は空のセットで、これはキューブに対応する grouping__id のサブセットです。

使用方法は次のとおりです。

-- rollup
set odps.sql.hive.compatible=true;    --输出grouping__id时才需要该设置
select
    store_code,
    director_code,
    manager_code,
    grouping__id,
    count(store_code) as cnt
from dim_mty_store
group by 
    manager_code,
    director_code,
    store_code
    with rollup 
;

-- 底层执行的逻辑等同于下面这段逻辑,这里只写group by部分
-- 1、全集
group by
    manager_code,
    director_code,
    store_code        -- grouping__id = 0

--2、全部子集
union all
group by
    manager_code,
    director_code        -- grouping__id = 1

union all
group by
    manager_code        -- grouping__id = 3

-- 3、空集
union all
group by 111            -- grouping__id = 7

3. セットのグループ化:

        キューブおよびロールアップの実行結果に不要なデータがあると思われる場合は、グループ化セットを使用してグループ化フィールドを柔軟に設定できます。独自のビジネス ニーズに応じてグループ化するフィールドの組み合わせを指定します。結合されたフィールドに含まれないフィールドは、最終的に空に設定されます。使用方法は次のとおりです。

-- grouping sets
set odps.sql.hive.compatible=true;  --输出grouping__id时才需要该设置
select
    store_code,
    director_code,
    manager_code,
    grouping__id,
    count(store_code) as cnt
from dim_mty_store
group by 
    manager_code,
    director_code,
    store_code
    grouping sets (
                       manager_code,
                      (manager_code, director_code), 
                      (manager_code, director_code, store_code) 
    ) ;


--结果等同于如下逻辑,这里只写group by
group by 
    manager_code, director_code, store_code    --grouping__id = 0

union all
group by 
    manager_code, director_code                --grouping__id = 1

union all
group by 
    manager_code                                --grouping__id = 3

この状況の最終結果は、理論的には最初の例の要件の結果と一致します。

もしあなたが初心者なら、私にアドバイスをください。あなたが専門家なら、馬鹿にしないでください。

おすすめ

転載: blog.csdn.net/TangYuG/article/details/120670732