从不同的数据集中删除值
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]
-------------------------
有什么建议吗?
谢谢
您可以使用交叉连接将 df1
与 df2
连接起来,然后使用 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]|
#+----+---------+
我有 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]
-------------------------
有什么建议吗?
谢谢
您可以使用交叉连接将 df1
与 df2
连接起来,然后使用 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]|
#+----+---------+