Pyspark在另一列的一列中查找模式

2024-09-30 06:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的数据帧,地址和街道名称。在

from pyspark.sql.functions import *
import pyspark.sql

df = spark.createDataFrame([\
    ['108 badajoz road north ryde 2113, nsw, australia', 'north ryde'],\
    ['25 smart street fairfield 2165, nsw, australia', 'smart street']
  ],\ 
  ['address', 'street_name'])

df.show(2, False)

+------------------------------------------------+---------------+
|address                                         |street_name    |
+------------------------------------------------+---------------+
|108 badajoz road north ryde 2113, nsw, australia|north ryde     |
|25 smart street fairfield 2165, nsw, australia  |smart street   |
+------------------------------------------------+---------------+

我想找出street_name是否存在于address中,并在新列中返回一个布尔值。我可以像下面这样手动搜索模式。在

^{pr2}$

但是我想用列street_name替换手动值,如下所示

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

Tags: nameimportstreetdfsqlsmartaddresscol
3条回答

只需使用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|
+          +      +                   +

一个简单的解决方案是定义一个UDF并使用它。例如

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")

在这里,简单地使用in是可能的,但是如果需要更复杂的功能,只需用正则表达式替换它。在

只需使用contains函数就可以做到这一点。有关详细信息,请参阅this

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   | 
+                        +      +   -+

相关问题 更多 >

    热门问题