2
votes

REGEXP_EXTRACT dans la ruche pour obtenir la sous-chaîne d'une chaîne

Salut, je suis nouveau dans Hive J'utilise regexp_extract pour obtenir une sous-chaîne à partir d'une chaîne

my string is '/abc/def/ghi/'

comment obtiendra abc ou def ou ghi en utilisant la fonction regexp_extract


0 commentaires

3 Réponses :


1
votes

Nous pouvons utiliser regexp_extract en fournissant un modèle avec des groupes de capture ciblant ce que nous voulons faire correspondre. Ensuite, nous pouvons spécifier quel groupe doit servir de remplacement.

À titre d'exemple, pour trouver le contenu entre les deuxième et troisième séparateurs de chemin, nous pouvons essayer:

regexp_extract('/abc/def/ghi/', '\/[^\/]+\/([^\/]+).*', 1)

Remarque: ce qui précède n'est pas testé et peut donner des erreurs s'il est nécessaire d'échapper aux barres obliques. Dans ce cas, utilisez ce qui suit:

regexp_extract('/abc/def/ghi/', '/[^/]+/([^/]+).*', 1)


3 commentaires

Salut Tim, j'ai créé une expression régulière dans oracle, c'est-à-dire REGEXP_SUBSTR ('/ abc / def / ghi /', '[^ /] * /', 1,2) pour obtenir abc et pour def < code> REGEXP_SUBSTR ('/ abc / def / ghi /', '[^ /] * /', 1,3) pour ghi REGEXP_SUBSTR ('/ abc / def / ghi /', '[ ^ /] * / ', 1,4) Je veux la même chose dans Hive .... Je ne veux pas changer mon modèle et pouvez-vous s'il vous plaît expliquer votre expression régulière, je l'apprécierai vraiment.


Désolé, mais votre modèle actuel ne fonctionnera probablement pas avec regexp_extract dans Hive. Et vous devriez essayer ma réponse avant de voter pour la rejeter.


ouais j'ai essayé, il renvoie def . pour obtenir abc et ghi , il y aura un modèle différent utilisé, non? pouvez-vous expliquer ce regexp_extract ('/ abc / def / ghi', '\ / [^ \ /] + \ / ([^ \ /] +). *', 1) aidez-moi à le comprendre. Merci



1
votes

Voici la requête.

   hive> select regexp_extract('/abc123./def456./ghi789/', '\/([\\w\\d.]*)\/([\\w\\d.]*)\/([\\w\\d.]*)',1);
OK
abc123.
Time taken: 0.103 seconds, Fetched: 1 row(s)
hive> select regexp_extract('/abc123./def456./ghi789/', '\/([\\w\\d.]*)\/([\\w\\d.]*)\/([\\w\\d.]*)',2);
OK
def456.
Time taken: 0.1 seconds, Fetched: 1 row(s)
hive> select regexp_extract('/abc123./def456./ghi789/', '\/([\\w\\d.]*)\/([\\w\\d.]*)\/([\\w\\d.]*)',3);
OK
ghi789
Time taken: 0.124 seconds, Fetched: 1 row(s)


3 commentaires

Et si les caractères ne sont pas des mots?


Monsieur - a mis à jour la requête pour inclure des chiffres et des caractères alphanumériques et spéciaux. , nous pouvons ajouter un caractère spécial supplémentaire dans [] si nécessaire


Ou mieux encore, utilisez simplement [^ \ /] pour faire correspondre tout caractère non séparateur de chemin.



2
votes

Supprimez les '/' de début et de fin et utilisez split () pour obtenir un tableau. split () utilise également l'expression rationnelle:

hive> select array[0], array[1], array[2] 
      from (select split(regexp_replace('/abc/def/ghi/','^/|/$',''),'/') as array) s;
OK
_c0     _c1     _c2
abc     def     ghi
Time taken: 0.192 seconds, Fetched: 1 row(s)

Ou dans une sous-requête:

hive> select split(regexp_replace('/abc/def/ghi/','^/|/$',''),'/')[0];

abc

hive> select split(regexp_replace('/abc/def/ghi/','^/|/$',''),'/')[1];

def

hive> select split(regexp_replace('/abc/def/ghi/','^/|/$',''),'/')[2];

ghi


1 commentaires

Salut leftjoin, je voulais que le motif soit le même. Votre réponse fonctionne pour moi. Merci de votre aide. :)