簡體   English   中英

Spark- 檢查兩個字符串列的交集

[英]Spark- check intersect of two string columns

我在下面有一個數據colA ,其中colAcolB包含字符串。 我正在嘗試檢查colB中是否包含colA值的colA字符串。 所述vaules可以包含,或空間,但只要任何部分colB的串具有重疊colA的,這是一個匹配。 例如,下面的第 1 行有重疊(“bc”),第 2 行沒有。

我正在考慮將值拆分為數組,但分隔符不是常量。 有人可以幫助闡明如何做到這一點嗎? 非常感謝您的幫助。

   +---+-------+-----------+
   | id|colA   | colB      |
   +---+-------+-----------+
   |  1|abc d  |  bc, z    |
   |  2|abcde  |  hj f     |
   +---+-------+-----------+

您可以使用自定義 UDF 來實現相交邏輯,如下所示 -

數據准備

from pyspark import SparkContext
from pyspark.sql import SQLContext
import pyspark.sql.functions as F

from pyspark.sql.types import StringType

import pandas as pd

data = {"id" :[1,2],
    "colA" : ["abc d","abcde"],
    "colB" : ["bc, z","hj f"]}
mypd = pd.DataFrame(data)

sparkDF = sql.createDataFrame(mypd)

sparkDF.show()

+---+-----+-----+
| id| colA| colB|
+---+-----+-----+
|  1|abc d|bc, z|
|  2|abcde| hj f|
+---+-----+-----+

UDF

def str_intersect(x,y):
    
    res = set(x) & set(y)
    if res:
        return ''.join(res)
    else:
        return None

str_intersect_udf = F.udf(lambda x,y:str_intersect(x,y),StringType())

sparkDF.withColumn('intersect',str_intersect_udf(F.col('colA'),F.col('colB'))).show()

+---+-----+-----+---------+
| id| colA| colB|intersect|
+---+-----+-----+---------+
|  1|abc d|bc, z|      bc |
|  2|abcde| hj f|     null|
+---+-----+-----+---------+

您可以使用正則表達式進行拆分,然后創建一個 UDF 函數來檢查子字符串。

例子:

spark = SparkSession.builder.getOrCreate()
data = [
    {"id": 1, "A": "abc d", "B": "bc, z, d"},
    {"id": 2, "A": "abc-d", "B": "acb, abc"},
    {"id": 3, "A": "abcde", "B": "hj f ab"},
]
df = spark.createDataFrame(data)
split_regex = "((,)?\s|[-])"
df = df.withColumn("A", F.split(F.col("A"), split_regex))
df = df.withColumn("B", F.split(F.col("B"), split_regex))


def mapper(a, b):
    result = []
    for ele_b in b:
        for ele_a in a:
            if ele_b in ele_a:
                result.append(ele_b)
    return result


df = df.withColumn(
    "result", F.udf(mapper, ArrayType(StringType()))(F.col("A"), F.col("B"))
)

結果:

root
 |-- A: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- B: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- id: long (nullable = true)
 |-- result: array (nullable = true)
 |    |-- element: string (containsNull = true)

+--------+-----------+---+-------+                                              
|A       |B          |id |result |
+--------+-----------+---+-------+
|[abc, d]|[bc, z, d] |1  |[bc, d]|
|[abc, d]|[acb, abc] |2  |[abc]  |
|[abcde] |[hj, f, ab]|3  |[ab]   |
+--------+-----------+---+-------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM