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. :)