从不同的数据集中删除值

Remove value from different datasets

我有 2 个 pyspark 数据集:

df_1

name |   number <Array>
-------------------------
12   |    [1, 2, 3]
-------------------------
34   |    [9, 8, 7]
-------------------------
46   |    [10]
-------------------------
68   |    [2, 88]
-------------------------

df_2

number_to_be_deleted <String>
------------------
1
------------------
2
------------------
10
------------------

如果 df_1 中存在 df_2 个数字,我想删除它们。 如果数组为 empty,我将其值更改为 null

我用了array_remove

df = df_1.select(F.array_remove(df_1.number, df_2.number_to_be_deleted)).collect()

我得到了:

TypeError: 'Column' object is not callable in array_remove

预期结果:

df_1

name |   number <Array>
-------------------------
12   |    [3]
-------------------------
34   |    [9, 8, 7]
-------------------------
46   |    null
-------------------------
68   |    [88]
-------------------------

有什么建议吗?

谢谢

您可以使用交叉连接将 df1df2 连接起来,然后使用 array_except to remove the values. Finally, using when you can check if the size 结果数组为空将其替换为 null

df2 = df2.groupBy().agg(collect_list("number_to_be_deleted").alias("to_delete"))

df1.crossJoin(df2).withColumn("number", array_except("number", "to_delete"))\
   .withColumn("number", when(size(col("number")) == 0, lit(None)).otherwise(col("number")))\
   .select("name", "number")\
   .show()

#+----+---------+
#|name|   number|
#+----+---------+
#|  12|      [3]|
#|  34|[9, 8, 7]|
#|  46|     null|
#|  68|     [88]|
#+----+---------+