以下代码出现在PROD中并且每天运行,我正在尝试对其进行优化。 我看到set hive.auto.convert.join = FALSE;正在进行一次Reduce连接,运行2.5小时,并产生2324381条记录的行数。
如果我设置hive.auto.convert.join = TRUE;然后它执行Map side join并且仅运行20分钟并产生5766529条记录的行数。
我需要知道为什么行数不同,这是正确的吗?行数是否可以不同?我的印象是O / P或查询应该保持不变,无论哪个连接发生。
源数据在这两种情况下保持不变,并且每个其他条件与我正在更改的配置单元设置的预期相同。
INSERT OVERWRITE TABLE krish
SELECT
s.svcrqst_id
s.svcrqst_lupdusr_id,
s.svcrqst_lstupd_dts as svcrqst_lupdt,
f.crsr_lupdt,
s.svcrqst_crt_dts,
s.svcrqst_asrqst_ind,
s.svcrtyp_cd,
s.svrstyp_cd,
s.asdplnsp_psuniq_id as psuniq_id,
s.svcrqst_rtnorig_in,
s.cmpltyp_cd,
s.catsrsn_cd,
s.apealvl_cd,
s.cnstnty_cd,
s.svcrqst_vwasof_dt,
f.crsr_master_claim_index,
t.svcrqct_cds,
r.sum_reason_cd,
r.sum_reason
from
table1 s
left outer join
(
select distinct
lpad(trim(i_srtp_sr_sbtyp_cd), 3, '0') as i_srtp_sr_sbtyp_cd,
lpad(trim(i_srtp_sr_typ_cd), 3, '0') as i_srtp_sr_typ_cd,
sum_reason_cd,
sum_reason
from table2
) r
on lpad(trim(s.svcrtyp_cd), 3, '0')=r.i_srtp_sr_typ_cd
and lpad(trim(s.svrstyp_cd), 3, '0')=r.i_srtp_sr_sbtyp_cd
left outer join table3 f
on trim(s.svcrqst_id)=trim(f.crsr_sr_id)
left outer join table4 t
on t.svcrqst_id=s.svcrqst_id
where
( year(s.svcrqst_lstupd_dts)=${hiveconf:YEAR} and month(s.svcrqst_lstupd_dts)=${hiveconf:MONTH} and day(s.svcrqst_lstupd_dts)=${hiveconf:DAY} )
or
( year(f.crsr_lupdt)=${hiveconf:YEAR} and month(f.crsr_lupdt)=${hiveconf:MONTH} and day(f.crsr_lupdt)=${hiveconf:DAY} )
;
答案 0 :(得分:0)
在对我的数据做了一些研究之后,我创建了所有的源表,并使用相同的列进行分区和删除,并重新启用了我的HQL。
这次map side join和reduce side join的行数都有相同的计数。
我认为在之前的查询中,由于数据未被分区,因此地图侧和减少侧连接具有不同的输出。