如何优化大型数据集的查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优化大型数据集的查询?相关的知识,希望对你有一定的参考价值。
我的原始查询 -
CREATE TABLE admin.FctPrfitAmt_rpt AS
SELECT rcn.* FROM
(SELECT t1.* FROM (SELECT * FROM admin.FctPrfitAmt t2 WHERE t2.scenario_id NOT IN(SELECT DISTINCT t3.scenario_id FROM admin.FctPrfitAmt_incr t3)
UNION ALL
SELECT * FROM admin.FctPrfitAmt_incr) t1) rcn;
问题是目前这个查询需要花费很多时间,因为涉及的记录数量很多。
有没有办法调整此查询?
我试过这种方法,但它不起作用 -
CREATE TABLE admin.FctPrfitAmt_rpt AS
SELECT * FROM admin.FctPrfitAmt t2
WHERE t2.scenario_id NOT exists (SELECT 1 from admin.FctPrfitAmt_incr t3 where t2.scenario_id = t3.scenario_id)
UNION ALL
SELECT * FROM admin.FctPrfitAmt_incr
错误 - 我的Hive版本不支持“不存在”,所以对于我的方法,我得到以下错误:
编译语句时出错:FAILED:ParseException行3:25无法识别'NOT''exists'附近的输入''('在表达式规范中
答案
- 你的语法错了。
NOT EXISTS
不应该在t2.scenario_id
之前 - 我们可以看到,scenario_id在两个表上都有偏差,这会在连接上创建一个巨大的产品。
select *
from admin.FctPrfitAmt pa
where not exists
(
select null
from (select distinct
pfa.scenario_id
from admin.FctPrfitAmt_incr pfa
) pfa
where pfa.scenario_id =
pa.scenario_id
)
union all
select *
from admin.FctPrfitAmt_incr
另一答案
你最好离开加入'select in'部分中的2个表并过滤掉连接键上非空的行。
CREATE TABLE admin.FctPrfitAmt_rpt AS
SELECT rcn.* FROM
(
SELECT t1.*
FROM admin.FctPrfitAmt t1
LEFT JOIN admin.FctPrfitAmt_incr t2
ON t1.scenario_id = t2.scenario_id
WHERE t2.scenario_id IS NULL
UNION ALL
SELECT * FROM admin.FctPrfitAmt_incr
) rcn
;
另一答案
select *
from (select *
,max(tab) over (partition by scenario_id) as max_tab
from ( select *,1 as tab from master.FctPrfitAmt
union all select *,2 as tab from master.FctPrfitAmt_incr
) t
) t
where tab = 2
or max_tab = 1
;
如果您的所有数据都包含基本类型(没有数组,地图等), 您可以使用以下查询:
select inline(array(original_rowset))
from (select original_rowset
,tab
,max(tab) over (partition by scenario_id) as max_tab
from ( select struct(*) as original_rowset,scenario_id,1 as tab from FctPrfitAmt
union all select struct(*) as original_rowset,scenario_id,2 as tab from FctPrfitAmt_incr
) t
) t
where tab = 2
or max_tab = 1
以上是关于如何优化大型数据集的查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何避免大型数据集的Pandas DataFrame中的for循环
如何优化 Python 中大型(75,000 项)布尔值集的操作?