簡體   English   中英

將 pyspark DataFrame 的每一行相交,這是一個字符串列表和一個主字符串列表?

[英]Intersect each row of a pyspark DataFrame which is a list of strings with a master list of strings?

假設我有一個這樣的 DataFrame。

[Row(case_number='5307793179', word_list=['n', 'b', 'c']),
 Row(case_number='5307793171', word_list=['w', 'e', 'c']),
 Row(case_number='5307793172', word_list=['1', 'f', 'c']),
 Row(case_number='5307793173', word_list=['a', 'k', 'c']),
 Row(case_number='5307793174', word_list=['z', 'l', 'c']),
 Row(case_number='5307793175', word_list=['b', 'r', 'c'])]

和一個像這樣的主詞表:

master_word_list = ['b', 'c']

是否有一種時尚的方法可以根據 master_word_list 過濾 word_list,因此生成的 pyspark 數據框如下所示。 (時尚我的意思是不使用 UDF,如果 UDF 是最好/唯一的方式,我也會接受它作為解決方案)

[Row(case_number='5307793179', word_list=['b', 'c']),
 Row(case_number='5307793171', word_list=['c']),
 Row(case_number='5307793172', word_list=['c']),
 Row(case_number='5307793173', word_list=['c']),
 Row(case_number='5307793174', word_list=['c']),
 Row(case_number='5307793175', word_list=['b', 'c'])]

array_intersect從 Spark 2.4 開始可用:

pyspark.sql.functions.array_intersect(col1, col2)

集合函數:返回col1和col2交集的元素組成的數組,沒有重復。

參數:

  • col1 – 包含數組的列的名稱
  • col2 – 包含數組的列的名稱
from pyspark.sql.functions import array, array_intersect, lit

master_word_list_col = array(*[lit(x) for x in master_word_list])

df = spark.createDataFrame(
    [("5307793179", ["n", "b", "c"])], 
    ("case_number", "word_list")
)

df.withColumn("word_list", array_intersect("word_list", master_word_list_col)).show()
+-----------+---------+
|case_number|word_list|
+-----------+---------+
| 5307793179|   [b, c]|
+-----------+---------+

暫無
暫無

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

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