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
3 Réponses :
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)
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
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)
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.
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
Salut leftjoin, je voulais que le motif soit le même. Votre réponse fonctionne pour moi. Merci de votre aide. :)