1

我需要在列(varchar)中搜索特定的整个单词。我正在使用下面的查询,但没有得到想要的结果;

    select *
    from table1
    WHERE upper(c.name) RLIKE ('FECHADO|CIERRE|CLOSED|REVISTO. NORMAL.')

我的问题是保证,例如“关闭”这个词,它只匹配;'Case Closed',但不是'Case Disclose '。上面的查询不能只匹配整个单词。任何人都可以帮助我找到实现这些结果的最佳方法,无论是在 HIVE 还是 IMPALA 中。

我最诚挚的问候

4

2 回答 2

0

我在这里解释了一个类似的解决方案:HIVE/PIG JOIN Based on SUBSTRING match 这会产生很多记录并且需要很长时间才能运行,但我认为它会比运行 like 运行得更好,因为它使用连接来完成匹配搜索所有记录。

如果这是唯一的蜂巢解决方案,我会在“”侧视图上爆炸,然后在关闭时匹配。

  1. split - 基于 " " 的拆分创建一个数组

  2. LATERAL VIEW EXPLODE - 将数组更改为行。

    WITH (
        select *
        from table1
        LATERAL VIEW EXPLODE(SPLIT( name, " ")) table_name as names
    ) as exploded_names
    
    select * from exploded_names
        where 
           names IN ('FECHADO','CIERRE','CLOSED','REVISTO.')
    
于 2021-12-17T15:23:04.483 回答
0

您可以添加单词边界\\b以仅匹配确切的单词:

rlike '(?i)\\bFECHADO\\b|\\bCIERRE\\b|\\bCLOSED\\b'

(?i)表示不区分大小写,无需使用 UPPER。

而你的正则表达式模式中的最后一个选择是REVISTO. NORMAL.

如果其中的点应该是字面上的点,请使用\\.

像这样:REVISTO\\. NORMAL\\.

正则表达式中的点表示任何字符,应该用两个反斜杠屏蔽以匹配点的字面意思。

以上正则表达式在 Hive 中有效。不幸的是,我没有 Impala 来测试它

于 2021-12-17T18:26:34.093 回答