Hive sql重量除去

5669 ワード

1、データ背景:まず、会社は2019年4月15日に335150件の注文があり、各注文の中に唯一の標識ID(order_id)が取引に対応している.
取引プロセスによっては、システムがその取引情報を報告する際に、注文済み、支払済み、出荷済み、配送中、受信済み、返品済み、返金済みなどの様々なトランザクションステータスが順次発生し、各トランザクションの発生はHiveテーブルに記録されます.そのため、当日の実際の取引量(唯一order_id)は70000件程度しかない可能性があります.
2、ジョブパラメータ:Hive sqlジョブを実行する前に、元のデータ量を評価し、Hiveのmapperとreducerの実行パラメータを構成する必要がある.
set mapred.max.split.size=256000;  //  mapper          ,   B
set mapred.min.split.size.per.node=256000;  //               ,   B
set mapred.min.split.size.per.rack=256000;  //               ,   B
set hive.exec.reducers.max=100;  //        reduce 
set hive.exec.reducers.bytes.per.reducer=102400000;  //  reducer      ,  B

3、解決方案:
(1)distinct:distinctは、大量のデータ(データセットが確かに大きい場合)間のshuffle比較(混洗)によって、すべての一意の識別結果セットをスクリーニングする必要がある.
select distinct order_id
from db.order
where dt='20190405'
  • 実行ログ:
  • MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 383.02 sec   HDFS Read: 24407412 HDFS Write: 789899 
    SUCCESS 
    Total MapReduce CPU Time Spent: 6 minutes 23 seconds 20 msec 
    OK 
    Time taken: 93.535 seconds, Fetched: 71809 row(s)
  • 論理解析:このHive sqlジョブ時に97個のmapperを起動してデータベースの335150個のレコードを引き出し、1個のreducer fetchのすべてのレコードを比較して重量を除去し、93.535秒を費やした.

  •  
    (2)groupby:この方法は、グループ化によって一意のグループを取得し、デリバリーシーンで識別フィールド(order_id)をグループ化するkey、すなわちgroupby order_に適用するid.
    select order_id
    from db.order
    where dt='20190405'
    group by order_id;
  • 実行ログ:
  • MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 400.63 sec   HDFS Read: 24410031 HDFS Write: 789899 
    SUCCESS 
    Total MapReduce CPU Time Spent: 6 minutes 40 seconds 630 msec 
    OK 
    Time taken: 85.937 seconds, Fetched: 71809 row(s)
  • 論理解析:このHive sqlジョブ時に97個のmapperを起動してデータベースの335150個のレコードを引き出し、1個のreducer fetchのすべてのレコードを比較して重量を除去し、93.535秒を費やした.

  •  
    (3)row number() over():
    select order_id
    from
    (
        select 
    order_id, row_number
    over(patition by order_id ) as num from db.order where dt='20180415'; ) order where num=1;
  • 実行ログ:
  • MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 458.32 sec   HDFS Read: 24298434 HDFS Write: 789899 
    SUCCESS 
    Total MapReduce CPU Time Spent: 7 minutes 38 seconds 320 msec 
    OK
     Time taken: 100.866 seconds, Fetched: 71809 row(s)
  • 論理解析:このHive sqlジョブ時に同様に97個のmapperを起動してデータベース中の335150個のレコードを引き出し、1個のreducer fetchのすべてのレコードを通じて同じパケットの下のレコードを番号付けし、num=1のレコードを取り出し、合計100.866秒を費やした.

  •  
    1.データ量が小さい場合、distinctの使用を優先し、可読性が強く、簡潔で効率的である.
    2.データ量が大きい場合、groupbyを使用することを推奨し、性能が信頼でき、mapperとreducerパラメータを組み合わせて設定した後、性能の最適化がより良い.
    3.row_number()over()ウィンドウ関数自体はパケット内ソートのために設計されており、num=1で制限された後もデータの重み付けとして使用することができる.