PySpark: Filter kerangka data berdasarkan substring di tabel lain

Saya memiliki dua kerangka data, a dan b:

a:

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

b:

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

Saya ingin memfilter semua baris dari kerangka data a di mana kolom kata sama dengan atau substring dari baris mana pun dari b, sehingga output yang diinginkan adalah:

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

Saya tahu ada fungsi a.word.contains(), a.word.like(), a.word.rlike(), dll yang dapat membantu saya menguji kondisi jika a.word memiliki substring. Masalahnya adalah saya akan mendapatkan baris b yang berisi nilai a.word, bukan baris a yang berisi b.word. Apakah ada fungsi untuk membantu menguji apakah a.word merupakan substring dari tabel lain?

Idealnya, solusi akan dapat beroperasi pada dua tabel bersama-sama alih-alih secara langsung melakukan iterasi pada nilai-nilai, misalnya SQL Join.


person andrew    schedule 09.10.2020    source sumber


Jawaban (1)


Gunakan contains() dalam kondisi gabung dengan left_anti sebagai jenis gabung.
anti gabung kiri mengembalikan semua baris dari tabel pertama yang tidak memiliki kecocokan di tabel kedua.

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
Terima kasih! Bekerja seperti pesona - person andrew; 12.10.2020