【发布时间】:2019-08-26 05:42:40
【问题描述】:
我需要通过将地址字段与类似街道的单词列表进行比较来识别具有有效地址的记录。
所以代码看起来像:
set street_list = 'STREET', 'ROAD', 'AVENUE', 'DRIVE', 'WAY', 'PLACE' (etc.)
;
create table [new table] as
select *
from [source table]
where [address line 1] (contains any word from STREET_LIST) or
[address line 2] (contains any word from STREET_LIST) or
[address line 3] (contains any word from STREET_LIST)
;
这可能吗?
使用 LostReality 的正则表达式建议,我得到了:
select *
from [source table]
where upper([address line 1]) regexp '.* STREET.*|.* ST.*|.* ROAD.*|.* RD.*|.* CLOSE.*|.* LANE.*|.* LA.*|.* AVENUE.*|.* AVE.*|.* DRIVE.*|.* DR.*|.* HOUSE.*|.* WAY.*|.* PLACE.*|.* SQUARE.*|.* WALK.*|.* GROVE.*|.* GREEN.*|.* PARK.*|.* PK.*|.* CRESCENT.*|.* TERRACE.*|.* PARADE.*|.* GARDEN.*|.* GARDENS.*|.* COURT.*|.* COTTAGES.*|.* COTTAGE.*|.* MEWS.*|.* ESTATE.*|.* RISE.*|.* FARM.*'
;
而且它似乎有效。
但是我有两个小问题:
1) 如何将正则表达式写在多行上以便于阅读?
2) 有什么方法可以将该正则表达式放入宏变量中,因为我想检查 5 个地址行并且我不想要同一表达式的 5 个副本。
谢谢
【问题讨论】:
-
如果 hiveQL 不支持,您可以将这些值输入到临时表中并使用
WHERE IN子句 -
嗨,dustytrash,我是 Hive 的新手,所以我还没有看到那个。语法是什么?谢谢
-
嗨,你有没有尝试使用 RLIKE 运算符?您可能可以从列表中生成一个正则表达式并将其用作单个条件?