我有一个在Hive数据库上运行的scala / spark包。它运行一个循环,运行查询以检查某些特定值是否存在数据
SELECT * FROM myTable WHERE col1 = 7879 AND col2= 1071 AND col3= 3027 LIMIT 1;
然后根据它是否返回一行继续。执行大约需要25秒。
我已经看到这种方式比
更快SELECT COUNT(*) FROM myTable WHERE col1 = 7879 AND col2= 1071 AND col3= 3027;
并根据计数是否为0继续进行。
是否有更快的方法来检查表中是否存在某些约束的数据?
编辑 - 循环基于另一个查询的结果行运行(产生100多行)。
答案 0 :(得分:0)
抛弃循环。
在单个查询中执行所有检查。
有多种方法可以编写查询,这是一种方法(假设result_set_of_another_query只是(col1,col2,col3)的唯一组合)。
select q.col1
,q.col2
,q.col3
,t.cnt
from result_set_of_another_query as q
join (select col1
,col2
,col3
,count(*) as cnt
from mytable
group by col1
,col2
,col3
) t
on t.col1 = q.col1
and t.col2 = q.col2
and t.col3 = q.col3
;
答案 1 :(得分:0)
如果您的表被分区,则不能使用where clasue。为了确保每个分区都有正确的数据,您只能在表中运行count(*)。如果要签入多个表,还可以使用union all,