如何通过 SQL 在字符串中搜索特定的完整单词,同时兼容 HIVE/IMPALA
how to search for specific whole words within a string , via SQL, compatible with both HIVE/IMPALA
我需要在列 (varchar) 中搜索特定的整个单词。我正在使用下面的查询,但没有得到想要的结果;
select *
from table1
WHERE upper(c.name) RLIKE ('FECHADO|CIERRE|CLOSED|REVISTO. NORMAL.')
我的问题是保证,例如 'CLOSED' 这个词,它只匹配; 'Case Closed',但不是 'Case Disclosed'。上面的查询不能只匹配整个单词。
谁能帮助我找到实现这些结果的最佳方法,无论是在 HIVE 还是 IMPALA.
谨致问候
我在这里解释了一个类似的解决方案:
这会产生很多记录并且需要很长时间才能运行,但我认为它会运行比运行点赞更好,因为它使用连接来完成匹配而不是搜索所有记录。
如果这是一个仅配置单元的解决方案,我会在横向视图上展开“”,然后在关闭时匹配。
split - 根据“”拆分生成一个数组
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.')
您可以添加单词边界 \b
以仅匹配确切的单词:
rlike '(?i)\bFECHADO\b|\bCIERRE\b|\bCLOSED\b'
(?i)
表示不区分大小写,不需要使用UPPER。
正则表达式模式中的最后一个替代项是 REVISTO. NORMAL.
如果其中的点应该是字面上的点,请使用 \.
像这样:REVISTO\. NORMAL\.
正则表达式中的点表示任何字符,应该用两个反斜杠屏蔽以匹配字面上的点。
以上正则表达式适用于 Hive。不幸的是我没有Impala来测试它
我需要在列 (varchar) 中搜索特定的整个单词。我正在使用下面的查询,但没有得到想要的结果;
select *
from table1
WHERE upper(c.name) RLIKE ('FECHADO|CIERRE|CLOSED|REVISTO. NORMAL.')
我的问题是保证,例如 'CLOSED' 这个词,它只匹配; 'Case Closed',但不是 'Case Disclosed'。上面的查询不能只匹配整个单词。 谁能帮助我找到实现这些结果的最佳方法,无论是在 HIVE 还是 IMPALA.
谨致问候
我在这里解释了一个类似的解决方案:
如果这是一个仅配置单元的解决方案,我会在横向视图上展开“”,然后在关闭时匹配。
split - 根据“”拆分生成一个数组
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.')
您可以添加单词边界 \b
以仅匹配确切的单词:
rlike '(?i)\bFECHADO\b|\bCIERRE\b|\bCLOSED\b'
(?i)
表示不区分大小写,不需要使用UPPER。
正则表达式模式中的最后一个替代项是 REVISTO. NORMAL.
如果其中的点应该是字面上的点,请使用 \.
像这样:REVISTO\. NORMAL\.
正则表达式中的点表示任何字符,应该用两个反斜杠屏蔽以匹配字面上的点。
以上正则表达式适用于 Hive。不幸的是我没有Impala来测试它