hive查询compare substr vs like to以精确子字符串结尾的字符串

6mw9ycah  于 2021-07-15  发布在  Hadoop
关注(0)|答案(1)|浏览(608)

我想从配置单元2上的一个非常大的表中筛选以“\u ends\u with”结尾的字符串\u字段,我有两个选择,它们的解释看起来几乎相同,一个使用substr,另一个使用like,在性能方面有什么更好的?什么会随着时间的推移运行得更快/使用更少的资源?为了解释除 predicate 部分以外的完全相同的结果,我将在以后将这个逻辑与其他大表一起使用。

使用substr查询1

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

查询2使用like:

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

ohtdti5x1#

对于这种类型的问题,您需要测试在您的环境中哪个对您的数据性能更好。
第二,两者并不等同,因为 _ 是中的通配符 LIKE 表达。所以 LIKE 将匹配 !end!with 例如。
不过,我还要补充一点,我希望他们也有类似的表现。两者都必须读取表中的所有数据并运行某种类型的字符串比较。读取数据通常是这样的查询中最昂贵的部分。
可能会有一些额外的开销 LIKE ,尤其是因为它处理的是三个通配符而不是一个通配符。但请记住 LIKE 是一个内置的操作符,为了在sql引擎中提高效率,已经做了几十年的努力。
就我个人而言,我会用 LIKE 不管任何小的性能问题。我花了很多时间调试查询,在那里我改变了我正在寻找的模式——并且错误地计算了字符。无论两种方法之间存在什么差异,查询中的错误对性能的影响都要大得多。

相关问题