以下是ETL生成的查询
查询 -
选择infaHiveSysTimestamp(‘SS’)作为a0,7991作为a1,single_use_subq30725.a1作为a2,SUBSTR(SUBSTR(single_use_subq30725.a2,0,5),0,5)作为a3,CAST(1 AS …
这个加入你的查询:
JOIN ( SELECT ... SKIPPED ... ) single_use_subq30725 WHERE (single_use_subq39991.a0 < single_use_subq30725.a0) AND (single_use_subq39991.a1 <= single_use_subq30725.a7)]
作为CROSS JOIN工作,因为没有指定ON条件。 在此CROSS JOIN之后,使用此过滤数据集 WHERE (single_use_subq39991.a0 < single_use_subq30725.a0) AND (single_use_subq39991.a1 <= single_use_subq30725.a7)
WHERE (single_use_subq39991.a0 < single_use_subq30725.a0) AND (single_use_subq39991.a1 <= single_use_subq30725.a7)
实际上它不会乘以行并且应该作为MAP-JOIN工作,因为第一个子查询最多返回一行:
SELECT MAX(t1.a0) as a0, MAX(t1.a1) as a1
添加此设置以启用map-join: set hive.auto.convert.join=true; 检查map-join是在EXPLAIN输出中。
set hive.auto.convert.join=true;
但最大的问题不是这个CROSS(MAP?)加入了自己。当在第二个查询中读取表时,它会阻止谓词下推在加入之前工作。
我建议删除连接并计算一次查询并提供 a0 和 a1 作为参数 where 条款。通过这种方式,您将消除不必要的连接,谓词下推可能直接起作用。
a0
a1
where
例如,PPD可以应用于此列: w5883634877684653839_read_lcl_tlog_raw_2_view__m_ctm_rawtlogdata_target_tbl.CREATE_TS as a0
w5883634877684653839_read_lcl_tlog_raw_2_view__m_ctm_rawtlogdata_target_tbl.CREATE_TS as a0
检查PPD和其他性能设置: https://stackoverflow.com/a/48296562/2700344