hive 查询比较 substr 与 LIKE 到以精确子字符串结尾的字符串

问题描述

我想从 Hive 2 上的一个非常大的表中过滤以“_ends_with”结尾的 string_field,我有 2 个选择,它们的 EXPLAIN 使用 substr 和另一个使用 LIKE 看起来几乎相同,这是什么在性能方面更好?什么会随着时间的推移运行得更快/使用更少的资源? thire EXPLAIN 返回与谓词部分完全相同的结果,稍后我将希望使用此逻辑与其他大表连接。

使用 substr 查询 1

SELECT id,url
FROM table
WHERE order = 0
  ... -- some more AND filter 
  AND substr(string_field,-9) = "_end_with";

VS

使用 LIKE 查询 2:

SELECT id,url
FROM table
WHERE order = 0
  ... -- some more AND filter 
  AND string_field LIKE "%\_end_with";

解决方法

对于此类问题,您需要测试哪个在您的环境中对您的数据表现更好。

其次,两者等价,因为 _LIKE 表达式中的通配符。因此,例如 LIKE 将匹配 !end!with

不过,我会补充一点,我希望它们具有类似的性能。两者都必须读取表中的所有数据并运行某种字符串比较。读取数据通常是此类查询中开销最大的部分。

LIKE 可能会有一些额外的开销,特别是因为它处理三个通配符而不是一个。但请记住,LIKE 是一个内置操作符,并且几十年来一直努力使其在 SQL 引擎中更高效。

就我个人而言,我会使用 LIKE,而不考虑任何小的性能问题。我花了时间调试查询,在那里我改变了我正在寻找的模式——并且错误地计算了字符。无论您的两种方法之间可能存在什么差异,查询中的错误都会对性能造成更严重的影响。