PySpark: กรอง dataframe ตามสตริงย่อยในตารางอื่น

ฉันมีสองดาต้าเฟรม a และ b:

a:

+-----+---------+
| word|frequency|
+-----+---------+
|  git|        5|
|stack|       10|
|match|       15|
|other|        3|
+-----+---------+

b:

+-------------+---------+
|         word|frequency|
+-------------+---------+
|       github|        5|
|       match |        2|
|stackoverflow|       10|
|      b_entry|        7|
+-------------+---------+

ฉันต้องการกรองแถวทั้งหมดออกจาก dataframe a โดยที่คอลัมน์คำเท่ากับหรือสตริงย่อยของแถวใด ๆ จาก b ดังนั้นผลลัพธ์ที่ต้องการคือ:

+-----+---------+
| word|frequency|
+-----+---------+
|other|        3|
+-----+---------+

ฉันรู้ว่ามีฟังก์ชัน a.word.contains(), a.word.like(), a.word.rlike() ฯลฯ ที่สามารถช่วยฉันทดสอบเงื่อนไขว่า a.word มีสตริงย่อยหรือไม่ ปัญหาของสิ่งเหล่านี้คือ ฉันจะลงเอยด้วยแถวของ b ที่มีค่าของ a.word แทนที่จะเป็นแถวของ a ที่มีค่าของ b.word มีฟังก์ชันใดบ้างที่จะช่วยทดสอบว่า a.word เป็นสตริงย่อยของตารางอื่นหรือไม่

ตามหลักการแล้ว โซลูชันจะสามารถดำเนินการบนสองตารางร่วมกัน แทนที่จะวนซ้ำค่าโดยตรง เช่น SQL Join


person andrew    schedule 09.10.2020    source แหล่งที่มา


คำตอบ (1)


ใช้ contains() ในเงื่อนไขการรวมโดยให้ left_anti เป็นประเภทการรวม
การต่อต้านการเข้าร่วมด้านซ้าย ส่งคืนแถวทั้งหมดจากตารางแรกซึ่งไม่ตรงกันในตารางที่สอง

df_a.show()
+-----+---------+                                                               
| word|frequency|
+-----+---------+
|  git|        5|
|stack|       10|
|match|       15|
|other|        3|
+-----+---------+
df_b.show()
+-------------+-----------+
|       word_1|frequency_1|
+-------------+-----------+
|       github|          5|
|        match|          2|
|stackoverflow|         10|
|      b_entry|          7|
+-------------+-----------+
from pyspark.sql.functions import *

df_a.join(df_b, (df_b.word_1.contains(df_a.word)), "left_anti").show()
+-----+---------+
| word|frequency|
+-----+---------+
|other|        3|
+-----+---------+
person Cena    schedule 10.10.2020
comment
ขอบคุณ! ทำงานเหมือนมีเสน่ห์ - person andrew; 12.10.2020