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
3 Réponses :
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.
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| +--------------------+------------+--------------------------------------+
Vous pouvez le faire en utilisant simplement la fonction contains
. Pour plus de détails, reportez-vous à ceci a >: from pyspark.sql.functions import col, when
df = df.withColumn('new_Col',when(col('address').contains(col('street_name')),True).otherwise(False))
df.show(truncate=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|true |
+------------------------------------------------+------------+-------+
Dans ce cas, c'est la meilleure solution.