hive--Sort Merge Bucket Map Join
Bucket Map Join
1.テスト1:2つの1億余りの記録の表は、データの傾斜とデカルト積が存在せず、テストの下で普通のjoinと差が少ない.
2.テスト2:4000万と5000万以上のテーブルjoin、関連キーデータが傾き、デカルト積、効果が明らかである.
2つのテーブルの関連キーはimeiで、imeiを押してバケツを分けてソートする必要があります.小さなテーブル(lxw_test)のバケツ数は大きなテーブル(lxw_test 1)の倍数です(これはネットで見たもので、このようにする必要があります.しばらくはそうします).
set hive.enforce.bucketing = true;
データを挿入する前に、このオプションを開く必要があります.
joinで開くパラメータ:
set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
小さなテーブルを駆動テーブル、mapjoinとします.
Insertデータも含めて、10分ほど差がありません.
もしこの2つの時計が普通のjoinをしていたら、1時間以上かかり、走りきれず、killが落ちました.
1.テスト1:2つの1億余りの記録の表は、データの傾斜とデカルト積が存在せず、テストの下で普通のjoinと差が少ない.
2.テスト2:4000万と5000万以上のテーブルjoin、関連キーデータが傾き、デカルト積、効果が明らかである.
create table lxw_test(imei string,sndaid string,data_time string)
CLUSTERED BY(imei) SORTED BY(imei) INTO 10 BUCKETS;
create table lxw_test1(imei string,sndaid string,data_time string)
CLUSTERED BY(imei) SORTED BY(imei) INTO 5 BUCKETS;
2つのテーブルの関連キーはimeiで、imeiを押してバケツを分けてソートする必要があります.小さなテーブル(lxw_test)のバケツ数は大きなテーブル(lxw_test 1)の倍数です(これはネットで見たもので、このようにする必要があります.しばらくはそうします).
set hive.enforce.bucketing = true;
データを挿入する前に、このオプションを開く必要があります.
insert overwrite table lxw_test
select imei,sndaid,null
from woa_all_user_info_his
where pt = '2012-05-28'
limit 40000000;
insert overwrite table lxw_test1
select imei,sndaid,data_time
from woa_all_user_info_his
where pt = '2012-05-28';
joinで開くパラメータ:
set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
select /*+ mapjoin(b) */ count(1)
from lxw_test1 a
join lxw_test b
on a.imei = b.imei
小さなテーブルを駆動テーブル、mapjoinとします.
Insertデータも含めて、10分ほど差がありません.
もしこの2つの時計が普通のjoinをしていたら、1時間以上かかり、走りきれず、killが落ちました.