Hive sql重量除去
5669 ワード
1、データ背景:まず、会社は2019年4月15日に335150件の注文があり、各注文の中に唯一の標識ID(order_id)が取引に対応している.
取引プロセスによっては、システムがその取引情報を報告する際に、注文済み、支払済み、出荷済み、配送中、受信済み、返品済み、返金済みなどの様々なトランザクションステータスが順次発生し、各トランザクションの発生はHiveテーブルに記録されます.そのため、当日の実際の取引量(唯一order_id)は70000件程度しかない可能性があります.
2、ジョブパラメータ:Hive sqlジョブを実行する前に、元のデータ量を評価し、Hiveのmapperとreducerの実行パラメータを構成する必要がある.
3、解決方案:
(1)distinct:distinctは、大量のデータ(データセットが確かに大きい場合)間のshuffle比較(混洗)によって、すべての一意の識別結果セットをスクリーニングする必要がある.実行ログ: 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.実行ログ: 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():実行ログ: 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で制限された後もデータの重み付けとして使用することができる.
取引プロセスによっては、システムがその取引情報を報告する際に、注文済み、支払済み、出荷済み、配送中、受信済み、返品済み、返金済みなどの様々なトランザクションステータスが順次発生し、各トランザクションの発生は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'
SUCCESS
Total MapReduce CPU Time Spent: 6 minutes 23 seconds 20 msec
OK
Time taken: 93.535 seconds, Fetched: 71809 row(s)
(2)groupby:この方法は、グループ化によって一意のグループを取得し、デリバリーシーンで識別フィールド(order_id)をグループ化するkey、すなわちgroupby order_に適用するid.
select order_id
from db.order
where dt='20190405'
group by order_id;
SUCCESS
Total MapReduce CPU Time Spent: 6 minutes 40 seconds 630 msec
OK
Time taken: 85.937 seconds, Fetched: 71809 row(s)
(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;
SUCCESS
Total MapReduce CPU Time Spent: 7 minutes 38 seconds 320 msec
OK
Time taken: 100.866 seconds, Fetched: 71809 row(s)
1.データ量が小さい場合、distinctの使用を優先し、可読性が強く、簡潔で効率的である.
2.データ量が大きい場合、groupbyを使用することを推奨し、性能が信頼でき、mapperとreducerパラメータを組み合わせて設定した後、性能の最適化がより良い.
3.row_number()over()ウィンドウ関数自体はパケット内ソートのために設計されており、num=1で制限された後もデータの重み付けとして使用することができる.