【发布时间】: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 支持的等效解决方案吗?
【问题讨论】:
虽然 Hive 支持积极的类似查询:例如。
select * from table_name where column_name like 'root~%';
Hive 不支持否定查询:例如
select * from table_name where column_name not like 'root~%';
有人知道 Hive 支持的等效解决方案吗?
【问题讨论】:
试试这个:
Where Not (Col_Name like '%whatever%')
也适用于 rlike:
Where Not (Col_Name rlike '.*whatever.*')
【讨论】:
在 HIVE 版本 0.8.0 中已支持 NOT LIKE,请查看 JIRA。
【讨论】:
在 SQL 中:
select * from table_name where column_name not like '%something%';
在蜂巢中:
select * from table_name where not (column_name like '%something%');
【讨论】:
如果您还没有,请查看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 子句中。 SELECT CASE WHEN ... THEN ... END AS colName FROM...
RLIKE,虽然它不会在所有情况下都是最佳的,但您可以使用正则表达式'not'^。对于您提供的示例colName RLIKE '[^r][^o][^o][^t]~\\w' 这可能不是最佳的正则表达式,但需要研究而不是子查询
(?!root) 但请注意,如果您在 bash 中执行此操作,则需要像 \! 一样转义 !,所以 bash 不会这么认为是一个事件。所以hive -e "SELECT * FROM table_name WHERE colName RLIKE '^(?\!root~).*$'" 的工作方式应该与其他数据库中的不同
使用 regexp_extract 也可以:
select * from table_name where regexp_extract(my_column, ('myword'), 0) = ''
【讨论】:
其实你可以这样:
select * from table_name where not column_name like 'root~%';
【讨论】:
在 impala 中,您可以使用 != 表示不喜欢:
columnname != value
【讨论】:
作为@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)
【讨论】: