Ich frage mich, wie/wenn ich die Regex verbessern kann, die ich in einer Abfrage verwende. Ich habe eine Reihe von Identifikatoren für bestimmte Benutzergruppen. Sie können in zwei Haupt Format:Regex in Hive QL (RLIKE) - Leistung?
X123
oderXY12
, (Typ 1)- zwei beliebige Buchstaben-Combo, mit Ausnahme von XY (Typ 2)
Typ-1-Gruppen immer sind Länge 4 Es ist entweder der Buchstabe X gefolgt von einer Zahl zwischen 100 und 999 (einschließlich) ODER XY gefolgt von Zahlen zwischen 0 und 99 (auf Länge 2 mit Nullen aufgefüllt).
Gruppen vom Typ 2 sind 2-Buchstaben-Strings mit beliebigem Buchstaben, ausgenommen XY (obwohl meine Abfrage dies nicht angibt).
Der Benutzer kann mehreren Gruppen angehören. In diesem Fall werden verschiedene Gruppen durch ein Rautenzeichen getrennt (#
). Hier ein Beispiel:
groups user age
X124 john 23
XY22#AB mike 33
AB peter 21
X122#XY01 francis 43
Ich mag Zeilen zählen, in denen mindestens eine Gruppe im zweiten Format angezeigt wird, das heißt, wo Benutzer nicht ausschließlich Mitglied der Gruppen im ersten Format vorliegt.
Ich muss alle Zeilen (d. H. Benutzer) abfangen, die nicht ausschließlich zum ersten Gruppentyp gehören. Im obigen Beispiel möchte ich die Benutzer john und francis ausschließen, da sie nur Mitglieder von Typ 1-Gruppen sind. Auf der anderen Seite ist mike OK, weil er Mitglied der AB-Gruppe (d. H. Gruppe von Typ 2) ist.
Ich mache es derzeit wie folgt aus:
select
count(*)
from
users
where
groups not rlike '^(X[Y1-9][0-9]{2,2})(#X[Y1-9][0-9]{2,2})*$'
Ist das schlechte Leistung klug? Und wie sollte ich es beheben?
Ihre Frage könnte hier besser tun: https://codereview.stackexchange.com/ –
@JimSimson Ich bin cool w/das - nur nicht wissen, wie/wenn ich kann, um es zu bewegen – hummingBird
Ich sage nicht unbedingt, dass es hier falsch ist, ich möchte vielleicht auch dort drüben posten. –