Удалить значение из разных наборов данных - PullRequest
0 голосов
/ 02 марта 2020

У меня есть 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_2, если они существуют в df_1. В случае, если массив будет empty, я изменю его значение на null.

Я использовал array_remove

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

Я получил:

TypeError: ' Объект столбца не может быть вызван в array_remove

Ожидаемый результат:

df_1

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

Есть предложения, пожалуйста?

Спасибо

1 Ответ

1 голос
/ 02 марта 2020

Вы можете объединить df1 с df2, используя перекрестное соединение, затем используйте array_except для удаления значений. Наконец, используя when, вы можете проверить, является ли размер массива результатов пустым, чтобы заменить его на 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]|
#+----+---------+
...