如何优化 Impala 查询以将 LIKE 与 IN 结合(字面上或有效地)?

How to optimize Impala query to combine LIKE with IN (literally or effectively)?

我需要尝试优化 Impala SQL 中的查询,该查询针对 50 亿多行数据库中的两列对大约 60 个不同的字符串进行部分字符串匹配。这两列中的值已加密,必须使用用户定义的函数(在 Java 中)进行解密才能进行部分字符串匹配。所以查询看起来像:

SELECT decrypt_function(column_A), decrypt_function(column_B) FROM myTable WHERE ((decrypt_function(column_A) LIKE '%' + partial_string_1 + '%') OR (decrypt_function(column_B) LIKE '%' + partial_string_1 + '%')) OR ((decrypt_function(column_A) LIKE '%' + partial_string_2 + '%') OR (decrypt_function(column_B) LIKE '%' + partial_string_2 + '%')) OR ... [up to partial_string_60]

我真正想做的是解密我正在比较的两列值,每行一次,然后将该值与所有部分字符串进行比较,然后转到下一行等(550 亿行).这有可能吗?在使用它对 60 个字符串中的每一个进行字符串比较之前,是否可以有一个子查询将解密的列值分配给一个变量?然后进入下一行...

或者是否可以进行其他优化?例如。使用 'IN',所以 ... WHERE (decrypt_function(column_A) IN ('%' + partial_string_1 + '%', '%' + partial_string_2 + '%', ... , '%' + partial_string_60 + '%')) OR (decrypt_function(column_B) IN ('%' + partial_string_1 + '%', '%' + partial_string_2 + '%', ... , '%' + partial_string_60 + '%'))

谢谢

使用子查询,并且 regexp_like 可以有许多与 OR (|) 连接的模式,因此您可以在单个正则表达式中检查所有备选方案,但您可能需要拆分成多个函数调用,如果模式字符串太长:

select colA, ColB 
from
(--decrypt in the subquery
SELECT decrypt_function(column_A) as colA, decrypt_function(column_B) as ColB 
  FROM myTable 
) as s
where 
--put most frequent substrings first in the regexp 
regexp_like(ColA,'partial_string_1|partial_string_2|partial_string_3') --add more
OR         
regexp_like(ColB,'partial_string_1|partial_string_2|partial_string_3')

在 Hive 中使用此语法:

where ColA rlike 'partial_string_1|partial_string_2|partial_string_3'
   OR ColB rlike 'partial_string_1|partial_string_2|partial_string_3'