3
votes

Modèle de recherche Pyspark dans une colonne de l'autre colonne

J'ai un dataframe avec deux colonnes, une adresse et un nom de rue.

 df.withColumn("new col", col("street")\
  .rlike(concat(lit('.*'),col('street_name'),col('.*))))\
  .show(20,False) 

Je veux savoir si street_name existe dans address et retourner un booléen dans une nouvelle colonne. Je peux rechercher le modèle manuellement comme ci-dessous.

df.withColumn("new col", col("street").rlike('.*north ryde.*')).show(20,False)
----------------------------------------------+---------------+-------+
|address                                         |street_name |new col|
+------------------------------------------------+------------+-------+
|108 badajoz road north ryde 2113, nsw, australia|north ryde  |true   |
|25 smart street fairfield 2165, nsw, australia  |smart street|false  |
+------------------------------------------------+------------+-------+

Mais je souhaite remplacer la valeur manuelle par la colonne street_name comme ci-dessous

XXX


0 commentaires

3 Réponses :


1
votes

Une solution simple serait de définir un UDF et de l'utiliser. Par exemple,

from pyspark.sql.functions import udf

def contains_address(address, street_name):
  return street_name in address

contains_address_udf = udf(contains_address, BooleanType())
df.withColumn("new_col", contains_address_udf("address", "street_name")

Ici, il est possible d'utiliser simplement dans , mais si une fonctionnalité plus compliquée est requise, remplacez-la simplement par une expression régulière.


0 commentaires

1
votes

utilisez simplement la fonction expr :

from pyspark.sql import functions as F

df.select(
    "address", 
    "street_name", 
    F.expr("address like concat('%',street_name,'%')")
).show()

+--------------------+------------+--------------------------------------+
|             address| street_name|address LIKE concat(%, street_name, %)|
+--------------------+------------+--------------------------------------+
|108 badajoz road ...|  north ryde|                                  true|
|25 smart street f...|smart street|                                  true|
+--------------------+------------+--------------------------------------+


0 commentaires