-----不加【distribute by uuid sort by uuid,servAddtime】-----16.7 G
insert overwrite table tmp_ods_sony_opendevice_llk_ps2
partition(pt='20210831')
select
devboot_id,devaddtime,servAddtime,brand,chanel,lang,network,packagename,
rommodel,sonymodel,modelname,uuid,vcode,vname,sony_userid,db_userid,ip,mac
from ods_sony_opendevice_llk_ps
where pt='20210831';
-----加【distribute by uuid sort by uuid,servAddtime】-----1.5 G
insert overwrite table tmp_ods_sony_opendevice_llk_ps2
partition(pt='20210831')
select
devboot_id,devaddtime,servAddtime,brand,chanel,lang,network,packagename,
rommodel,sonymodel,modelname,uuid,vcode,vname,sony_userid,db_userid,ip,mac
from ods_sony_opendevice_llk_ps
where pt='20210831'
distribute by uuid sort by uuid,servAddtime; ---这里是唯一的区别
---结论:加【distribute by uuid sort by uuid,servAddtime】后,磁盘空间可以缩减16倍
2.1.1、order by
hive 中的 order by 语句会对查询结果做一次全局排序,即,所有的 mapper 产生的结果都会交给一个 reducer 去处理,无论数据量大小,job 任务只会启动一个 reducer,如果数据量巨大,则会耗费大量的时间。
尖叫提示:如果在严格模式下,order by 需要指定 limit 数据条数,不然数据量巨大的情况下
会造成崩溃无输出结果。涉及属性:set hive.mapred.mode=nonstrict/strict
例如:按照 money 排序的例子
select * from company_info order by money desc;
2.1.2、sort by
hive 中的 sort by 语句会对每一块局部数据进行局部排序,即,每一个 reducer 处理的数据都是有序的,但是不能保证全局有序。
2.1.3、distribute by
hive 中的 distribute by 一般要和 sort by 一起使用,即将某一块数据归给(distribute by)某一个reducer 处理,然后在指定的 reducer 中进行 sort by 排序。
order by---------全局排序
sort by----------reduce内部排序
distribute by----指定reduce分区的字段