INSERT OVERWRITE DIRECTORY '/abc/def/gk' ROW FORMAT delimited fields terminatd by '\t' stored as textfile select * from
dtw.dtw_dwd_property_work_order_target_d t1
left SEMI join(
select order_id from
( select order_id,count(*) as cnt from dtw.dtw_dwd_property_work_order_target_d
where ds='20180607' group by order_id
) t where cnt>1 ) t2
on t1.order_id=t2.order_id
sql实现的功能:一条工单包含多条数据的这类工单全部导出
上述sql中, dtw_dwd_property_work_order_target_d是一个包括所有历史时间分区数据的表格,非常庞大。
紫色sql中,指明的具体的时间分区,查询结果存放在t表中,结果不算大;
黄色sql中,从t表中查询id,带有where条件,结果存放在t2表中,也不算大;
红色字体的sql,其中,dtw.dtw_dwd_property_work_order_target_d t1 没有指定时间分区,则会扫描该表所有历史时间分区数据,并且缓存到集群系统盘,最终将系统盘撑爆,宕机。
为了实现上述功能,sql可以简化为:
select order_id from dtw.dtw_dwd_property_work_order_target_d
where ds='20180607'
group by order_id
having count(1) > 1;