Hive QL(RLIKE)中的正则表达式?

问题描述:

我想知道如何/如果我可以改善我在查询中使用的正则表达式。我有一组用于特定用户组的标识符。它们可以是在两个主要格式:Hive QL(RLIKE)中的正则表达式?

  • X123XY12,(1型)
  • 任何两个字母的组合,不包括XY(2型)

类型1组始终是长度为4的它可以是字母X后跟一个介于100和999之间的数字或XY后跟数字0和99之间的数字(用零填充到长度2)。

类型2组是2个字母的字符串,允许任何字母,不包括XY(尽管我的查询没有指定这个字符串)。

用户可以属于多个组,在这种情况下,不同的组由磅符号分隔(#)。下面是一个例子:

groups  user  age 
X124  john  23 
XY22#AB mike  33 
AB   peter 21 
X122#XY01 francis 43 

我想,其中用户是不排他地在第一格式组的成员进行计数,其中在第二格式的至少一个基团出现的行,即。

我需要捕捉所有不属于第一类组的专用行(即用户)。在上面的示例中,我想排除用户约翰弗朗西斯,因为它们只是类型1组的成员。 另一方面,麦克是可以的,因为他是AB组的成员(即组2类型的成员)。

目前,我正在做这样的:

select 
    count(*) 
from 
    users 
where 
    groups not rlike '^(X[Y1-9][0-9]{2,2})(#X[Y1-9][0-9]{2,2})*$' 

这是糟糕的表现明智?我应该如何解决它?

+0

你的问题可能会做的更好位置:https://codereview.stackexchange.com/ –

+0

@JimSimson我冷静瓦特/那 - 只是不知道如何/如果我可以将它移到 – hummingBird

+0

我并不是说,这里是错的,只是可能想在那里发帖。 –

我想计算至少有一组出现第二种格式的行。

这似乎再简单一点,选择where groups like

\b(?:(?!XY)[A-Z]{2})\b 

\b是一个字边界。它不消耗一个字符,而是指出那里不能有非字母数字字符。

Live demo.

+0

而写了我的答案,您在示例中排除了AY。你的衣服抓住了AY。否则,它看起来更简单。 – hummingBird

+1

你说'任何两个字母组合,只要第二个不是Y(类型2)'。 我已经更新了“组2不包括XY'的演示:https://regex101.com/r/EZRsuZ/2 – linden2015

+0

好吧,它是一个编辑..我的坏。我添加了一些修改,但我也修复了组描述。 – hummingBird