在hive中使用regexp_extract时如何限制字符?

时间:2018-02-02 15:02:31

标签: regex hive

我有一个固定长度的字符串,我需要将部分提取为字段。 ACCOUNT1的前5个字符,ACCOUNT2的后2个字符,依此类推。

我想使用regexp_extract(不是子字符串),但我忽略了这一点。他们没有任何回报。

select regexp_extract('47t7916A2088M040323','(.*){0,5}',1) as ACCOUNT1,
       regexp_extract('47t7916A2088M040323','(.*){6,8}',1) as ACCOUNT2 --and so on

1 个答案:

答案 0 :(得分:1)

如果你想使用正则表达式,那么就像在这个例子中一样使用它。对于Account1表达式'^(.{5})'表示:^是字符串的开头,然后捕获由任意5个字符组成的组1(组在圆括号中)。 {5} - 是量词,意味着5次。对于Account2 - 捕获组2在group1之后。 (.{2}) - 表示两个任意字符。

在第二个正则表达式的这个例子中,有两组(第一列和第二列),我们提取第二组。

hive> select regexp_extract('47t7916A2088M040323','^(.{5})',1) as Account1,
    >  regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',2) as Account2;
OK
47t79   16
Time taken: 0.064 seconds, Fetched: 1 row(s)

实际上,您可以为所有列使用相同的正则表达式包含组,从而提取不同的捕获组 使用相同正则表达式并提取不同组的示例:

hive> select regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',1) as Account1,
    > regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',2) as Account2
    > ;
OK
47t79   16
Time taken: 1.043 seconds, Fetched: 1 row(s)

为每列添加更多组。此方法仅适用于固定长度的列。如果要解析分隔的字符串,则在组之间放置分隔符,修改组以匹配除分隔符以外的所有内容并删除/修改量词。对于这样的示例,子字符串或分割用于分隔字符串看起来更简单和更清晰,regexp允许解析非常复杂的模式。希望你能抓住这个主意。