Шаблон поиска Pyspark в одном столбце в другом столбце - PullRequest
2 голосов
/ 01 апреля 2019

У меня есть датафрейм с двумя столбцами, адресом и названием улицы.

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 и вернуть логическое значение в новом столбце. Я могу искать шаблон вручную, как показано ниже.

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

Но я хочу заменить ручное значение на столбец street_name, как показано ниже

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

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Вы можете сделать это, просто используя функцию 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   | 
+------------------------------------------------+------------+-------+
1 голос
/ 01 апреля 2019

просто используйте функцию 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|
+--------------------+------------+--------------------------------------+
1 голос
/ 01 апреля 2019

Простым решением было бы определить 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, но если требуется более сложная функциональность, просто замените его регулярным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...