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 :
L'expression serait:
select regexp_extract(col, 'P[0-9]+')
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.
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.
Sélectionnez simplement le groupe 0
regexp_extract(promo_name, 'P[0-9]+',0)
La fonction regexp_extract
prendra 3 paramètres.
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
stackoverflow.com/questions/ 63017975 /…