如何优化大型数据集上的查询?

zaqlnxep  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(486)

我的原始查询-

  1. CREATE TABLE admin.FctPrfitAmt_rpt AS
  2. SELECT rcn.* FROM
  3. (SELECT t1.* FROM (SELECT * FROM admin.FctPrfitAmt t2 WHERE t2.scenario_id NOT IN(SELECT DISTINCT t3.scenario_id FROM admin.FctPrfitAmt_incr t3)
  4. UNION ALL
  5. SELECT * FROM admin.FctPrfitAmt_incr) t1) rcn;

问题是,目前这个查询需要很多时间,因为涉及的记录数量很多。
有没有办法调整这个查询?
我试过这种方法,但不起作用-

  1. CREATE TABLE admin.FctPrfitAmt_rpt AS
  2. SELECT * FROM admin.FctPrfitAmt t2
  3. WHERE t2.scenario_id NOT exists (SELECT 1 from admin.FctPrfitAmt_incr t3 where t2.scenario_id = t3.scenario_id)
  4. UNION ALL
  5. SELECT * FROM admin.FctPrfitAmt_incr

错误-我的配置单元版本似乎不支持“not exists”,因此对于我的方法,我得到以下错误:
编译语句时出错:失败:parseexception行3:25无法识别表达式规范中“not”(不存在)()附近的输入

yduiuuwa

yduiuuwa1#

最好在“select-in”部分连接这两个表,并过滤掉join键上不为null的行。

  1. CREATE TABLE admin.FctPrfitAmt_rpt AS
  2. SELECT rcn.* FROM
  3. (
  4. SELECT t1.*
  5. FROM admin.FctPrfitAmt t1
  6. LEFT JOIN admin.FctPrfitAmt_incr t2
  7. ON t1.scenario_id = t2.scenario_id
  8. WHERE t2.scenario_id IS NULL
  9. UNION ALL
  10. SELECT * FROM admin.FctPrfitAmt_incr
  11. ) rcn
  12. ;
gopyfrb3

gopyfrb32#

  1. select *
  2. from (select *
  3. ,max(tab) over (partition by scenario_id) as max_tab
  4. from ( select *,1 as tab from master.FctPrfitAmt
  5. union all select *,2 as tab from master.FctPrfitAmt_incr
  6. ) t
  7. ) t
  8. where tab = 2
  9. or max_tab = 1
  10. ;

如果您的所有数据都由基本类型组成(没有数组、Map等),
您可以使用以下查询:

  1. select inline(array(original_rowset))
  2. from (select original_rowset
  3. ,tab
  4. ,max(tab) over (partition by scenario_id) as max_tab
  5. from ( select struct(*) as original_rowset,scenario_id,1 as tab from FctPrfitAmt
  6. union all select struct(*) as original_rowset,scenario_id,2 as tab from FctPrfitAmt_incr
  7. ) t
  8. ) t
  9. where tab = 2
  10. or max_tab = 1
展开查看全部
4urapxun

4urapxun3#

你的语法错了。 NOT EXISTS 不应在前面加上 t2.scenario_id 正如我们所看到的,场景id在两个表上都是倾斜的,它在连接上创建了一个巨大的乘积。

  1. select *
  2. from admin.FctPrfitAmt pa
  3. where not exists
  4. (
  5. select null
  6. from (select distinct
  7. pfa.scenario_id
  8. from admin.FctPrfitAmt_incr pfa
  9. ) pfa
  10. where pfa.scenario_id =
  11. pa.scenario_id
  12. )
  13. union all
  14. select *
  15. from admin.FctPrfitAmt_incr
展开查看全部

相关问题