【问题标题】:Is there a Hive equivalent of SQL "not like"是否存在相当于 SQL“不喜欢”的 Hive
【发布时间】:2011-08-03 10:26:27
【问题描述】:

虽然 Hive 支持积极的类似查询:例如。

select * from table_name where column_name like 'root~%';

Hive 支持否定查询:例如

select * from table_name where column_name not like 'root~%';

有人知道 Hive 支持的等效解决方案吗?

【问题讨论】:

    标签: syntax hive sql-like


    【解决方案1】:

    试试这个:

    Where Not (Col_Name like '%whatever%')
    

    也适用于 rlike:

    Where Not (Col_Name rlike '.*whatever.*')
    

    【讨论】:

      【解决方案2】:

      在 HIVE 版本 0.8.0 中已支持 NOT LIKE,请查看 JIRA。

      https://issues.apache.org/jira/browse/HIVE-1740

      【讨论】:

        【解决方案3】:

        在 SQL 中:

        select * from table_name where column_name not like '%something%';
        

        在蜂巢中:

        select * from table_name where not (column_name like '%something%');
        

        【讨论】:

          【解决方案4】:

          如果您还没有,请查看https://cwiki.apache.org/confluence/display/Hive/LanguageManual。我在为 hive 编写查询时一直引用它。

          我没有尝试匹配单词的一部分,但您可以查看RLIKE(在本节中https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#Relational_Operators

          这可能是一个 hack 工作,但您可以执行子查询,检查它是否与正值匹配并执行 CASE (http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF#Conditional_Functions) 以获得主查询的已知值检查是否匹配。

          另一种选择是编写一个进行检查的 UDF。

          我只是在无法访问 Hive 的情况下坐在家里进行头脑风暴,所以我可能遗漏了一些明显的东西。 :)

          希望能以某种方式有所帮助。 \^_^/

          编辑:从我下面的评论中添加其他方法。

          对于您提供的示例 colName RLIKE '[^r][^o][^o][^t]~\w' 这可能不是最佳的正则表达式,但需要研究而不是子查询

          【讨论】:

          • 看起来 CASE 会做我需要做的事情,但我在语法上有问题。它是放在 Select 子句还是 Where 子句中?此尝试失败:'create table tmp_table as CASE WHEN a.username like 'twitter~%' THEN'' ELSE select sum(file_size) as storage, sum(bandwidth) as bandwidth from tmp_sites_compare1 a;'但它在 where 子句中对我来说没有意义......想法?
          • @CMaury:CASESELECT 子句中。 SELECT CASE WHEN ... THEN ... END AS colName FROM...
          • @CMaury:我开始在我的工作中使用RLIKE,虽然它不会在所有情况下都是最佳的,但您可以使用正则表达式'not'^。对于您提供的示例colName RLIKE '[^r][^o][^o][^t]~\\w' 这可能不是最佳的正则表达式,但需要研究而不是子查询
          • 哈哈。是的,这甚至比子查询更好......感谢所有的帮助。接受你的回答。
          • 要进行负正则表达式前瞻,您可以使用 (?!root) 但请注意,如果您在 bash 中执行此操作,则需要像 \! 一样转义 !,所以 bash 不会这么认为是一个事件。所以hive -e "SELECT * FROM table_name WHERE colName RLIKE '^(?\!root~).*$'" 的工作方式应该与其他数据库中的不同
          【解决方案5】:

          使用 regexp_extract 也可以:

          select * from table_name where regexp_extract(my_column, ('myword'), 0) = ''
          

          【讨论】:

            【解决方案6】:

            其实你可以这样:

            select * from table_name where not column_name like 'root~%';
            

            【讨论】:

              【解决方案7】:

              在 impala 中,您可以使用 != 表示不喜欢:

              columnname != value
              

              【讨论】:

                【解决方案8】:

                作为@Sanjiv answered

                hive 支持not like

                0: hive> select * from dwtmp.load_test;
                +--------------------+----------------------+
                | load_test.item_id  | load_test.item_name  |
                +--------------------+----------------------+
                | 18282782           | NW                   |
                | 1929SEGH2          | BSTN                 |
                | 172u8562           | PLA                  |
                | 121232             | JHK                  |
                | 3443453            | AG                   |
                | 198WS238           | AGS                  |
                +--------------------+----------------------+
                6 rows selected (0.224 seconds)
                
                0: hive> select * from dwtmp.load_test where item_name like '%ST%';
                +--------------------+----------------------+
                | load_test.item_id  | load_test.item_name  |
                +--------------------+----------------------+
                | 1929SEGH2          | BSTN                 |
                +--------------------+----------------------+
                1 row selected (0.271 seconds)
                
                0: hive> select * from dwtmp.load_test where item_name not like '%ST%';
                +--------------------+----------------------+
                | load_test.item_id  | load_test.item_name  |
                +--------------------+----------------------+
                | 18282782           | NW                   |
                | 172u8562           | PLA                  |
                | 121232             | JHK                  |
                | 3443453            | AG                   |
                | 198WS238           | AGS                  |
                +--------------------+----------------------+
                5 rows selected (0.247 seconds)
                
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-03
                  • 2017-09-06
                  • 2018-10-13
                  • 2012-12-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多