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.