1
votes

Expression régulière pour rechercher un caractère spécifique dans une chaîne

J'ai ces exemples de valeurs

select distinct
    promo_name
   ,regexp_extract(promo_name, '(?<=p\d+\s+)P\d+') as regexp_id
from stock
where promo_name is not null


select distinct
    promo_name
   ,regexp_extract(promo_name, 'P[0-9]+') as regexp_id
from stock
where promo_name is not null

Je dois trouver P2, P02, P11, p06, p05 comme ceci, en essayant d'utiliser la fonction Regexp_extract dans les databricks. du mal à trouver la bonne expression. Une fois que je trouve P10, p6 à partir de la chaîne, je dois mettre des nombres dans une nouvelle colonne appelée ID

prm_2020 P02 United Kingdom London 2 for 2
prm_2020 P2 United Kingdom London 2 for 2
prm_2020 P10 United Kingdom London 2 for 2
prm_2020 P11 United Kingdom London 2 for 2

les deux générant des erreurs


4 Réponses :


0
votes

L'expression serait:

select regexp_extract(col, 'P[0-9]+')


4 commentaires

Erreur dans l'instruction SQL: SparkException: travail abandonné en raison d'un échec d'étape: la tâche 6 à l'étape 179.0 a échoué 4 fois, échec le plus récent: tâche perdue 6.3 à l'étape 179.0 (TID 12754, 10.92.191.203, exécuteur 23): java.lang.IndexOutOfBoundsException : Pas de groupe 1


vous devriez probablement traiter des chaînes qui ne renverront aucune correspondance dans votre instruction select, en utilisant une sorte de construction IF NULL.


merci veverke, il n'y a pas de valeur nulle dans ma colonne car elle a déjà été filtrée


@ user3061338. . . Je ne vois pas comment un regexp_extract () pourrait provoquer une erreur hors limites. Quelque chose d'autre semble se passer.



0
votes

Une expression régulière pourrait être (? <= prm_ \ d + \ s +) P \ d + Outre la recherche de chaînes sous la forme P * où * est un chiffre, il vérifie également que ces chaînes sont précédées de chaînes de la forme prm_ * où * est un chiffre.

Gardez à l'esprit la sensibilité à la casse. La solution ci-dessus est sensible à la casse (si votre entrée est fournie sous forme de PRM, votre correspondance sera rejetée.) Je ne suis pas familier avec apache-spark mais je suppose qu'il prend en charge des paramètres tels que / i comme d'autres plates-formes pour indiquer que l'expression régulière devrait être la casse insensible.

Démo Regexr.com


0 commentaires

0
votes

Sélectionnez simplement le groupe 0

regexp_extract(promo_name, 'P[0-9]+',0)


0 commentaires

0
votes

La fonction regexp_extract prendra 3 paramètres.

  • Valeur de colonne
  • Modèle d'expression régulière
  • Index de groupe
df.createTempView("tbl")
spark
.sql("select data,regexp_extract(data,'(P[0-9]*)',0) as parsed_data from tbl")
.show(truncate=False)
+------------------------------------------+-----------+
|data                                      |parsed_data|
+------------------------------------------+-----------+
|prm_2020 P02 United Kingdom London 2 for 2|P02        |
|prm_2020 P2 United Kingdom London 2 for 2 |P2         |
|prm_2020 P10 United Kingdom London 2 for 2|P10        |
|prm_2020 P11 United Kingdom London 2 for 2|P11        |
+------------------------------------------+-----------+

Il vous manque le dernier paramètre dans la fonction regexp_extract .

Vérifiez le code ci-dessous.

df
.withColumn("parsed_data",regexp_extract(col("data"),"(P[0-9]*)",0))
.show(truncate=False)
+------------------------------------------+-----------+
|data                                      |parsed_data|
+------------------------------------------+-----------+
|prm_2020 P02 United Kingdom London 2 for 2|P02        |
|prm_2020 P2 United Kingdom London 2 for 2 |P2         |
|prm_2020 P10 United Kingdom London 2 for 2|P10        |
|prm_2020 P11 United Kingdom London 2 for 2|P11        |
+------------------------------------------+-----------+
scala> df.show(truncate=False)
+------------------------------------------+
|data                                      |
+------------------------------------------+
|prm_2020 P02 United Kingdom London 2 for 2|
|prm_2020 P2 United Kingdom London 2 for 2 |
|prm_2020 P10 United Kingdom London 2 for 2|
|prm_2020 P11 United Kingdom London 2 for 2|
+------------------------------------------+
def regexp_extract(e: org.apache.spark.sql.Column,exp: String,groupIdx: Int): org.apache.spark.sql.Column


0 commentaires