配置单元:使用LOWER函数时性能变慢

toiithl6  于 2022-09-20  发布在  Hadoop
关注(0)|答案(1)|浏览(168)

我需要搜索不区分大小写的关键字。为此,我使用以下查询。合乎逻辑的好吧,但性能会急剧下降。

表格信息

item_tbl: 558991075
keywords: 2000
SELECT itemname from items i
LEFT JOIN keywords k
ON i.id = k.item_id
AND lower(i.itemname) LIKE CONCAT('%', lower(k.value), '%')
WHERE l.item_id is null

示例:

Keywords:
    Iphone x
    Yellow Mango
    Red onion

    Item names:
    Some Item 1
    Red color Iphone X
    Big Yellow Mango

最终有效项是Some Item 1

有什么方法可以提高这个查询性能吗?

t3irkdon

t3irkdon1#

花费时间最多的可能是like。如果您要经常使用这个查询,并且它不是一次性的,那么您应该尝试并预先计算它。或者,您应该尝试将其设置为直接连接。

有没有分隔符可以用来减少与like比较的项目数。在使用like时,基本上必须将每条记录与其他记录进行比较。

  • 将i.itemname拆分成类似explode(split(i.itemname, ' ')) as words的“单词”
  • 拆分k.value以获得至少潜在的匹配项,从而大大减少您评估的单词
  • 在匹配lower(split(k.value, ' ')[0]) = lower(words)的‘word’上加入
  • 最后是您希望进行的实际匹配where lower(i.itemname) LIKE CONCAT('%', lower(k.value), '%')

这将使联接的能力能够将数据发送到正确的Reducer,并减少比较的数量。

相关问题