Сравните 2 массива и удалите только экземпляры значений, которые существуют в обоих массивах pyspark

#arrays #pyspark

#массивы #пыспарк

Вопрос:

У меня есть 2 столбца массива

 | A | B | | -----------------------|------------------| | [0.0001,0.0045,0.0031] |[0.0001,0.0031] | | [2.5,1.0,0.5,3.0] | [2.5, 0.5, 3.0] | | [1.0,1.0,1.5,1.0] | [1.0,1.0] |  

Я хочу создать новый столбец, представляющий собой массив только тех значений, которые не включены в оба массива, но я хочу, чтобы он обращал внимание на экземпляры, например, если .0001 существует в обоих массивах, но он существует один раз в одном массиве и дважды в другом, я хочу, чтобы он оставил 1 оставшийся экземпляр .0001.

 | A | B | C | | -----------------------|------------------|-----------------| | [0.0001,0.0045,0.0031] |[0.0001,0.0031] |[0.0045] |  | [2.5,1.0,0.5,3.0] | [2.5, 0.5, 3.0] |[1.0] | | [1.0,1.0,1.5,1.0] | [1.0,1.0] |[1.0, 1.5] |  

Есть идеи, как это сделать с помощью Pyspark? На данный момент я использую df.withColumn(«C», F. array_except(F. col(«A»), F. col(«B»))), но это удаляет все экземпляры чисел.

Комментарии:

1. Вы пробовали использовать udf?

2. нет, еще нет. Я займусь этим вопросом.

Ответ №1:

Используйте Counter from collections в an udf , чтобы получить разницу между вхождениями каждого значения. использование - метода вместо subtract метода на счетчиках приведет к пропуску значений с числом 0.

 from pyspark.sql import functions as f from collections import Counter  l = [([0.0001,0.0045,0.0031],[0.0001,0.0031]),([2.5,1.0,0.5,3.0],[2.5, 0.5, 3.0]),([1.0,1.0,1.5,1.0],[1.0,1.0])] df = spark.createDataFrame(l,"A:arraylt;doublegt;,B:arraylt;doublegt;")) df.show()  ------------------------ ----------------  |A |B |  ------------------------ ----------------  |[0.0001, 0.0045, 0.0031]|[0.0001, 0.0031]| |[2.5, 1.0, 0.5, 3.0] |[2.5, 0.5, 3.0] | |[1.0, 1.0, 1.5, 1.0] |[1.0, 1.0] |  ------------------------ ----------------    @f.udf('arraylt;doublegt;') def arr_udf(c1,c2):  diff = Counter(c1) - Counter(c2)  return list(diff)  df = df.withColumn('C',arr_udf('A','B')) df.show()  ------------------------ ---------------- ----------  |A |B |C |  ------------------------ ---------------- ----------  |[0.0001, 0.0045, 0.0031]|[0.0001, 0.0031]|[0.0045] | |[2.5, 1.0, 0.5, 3.0] |[2.5, 0.5, 3.0] |[1.0] | |[1.0, 1.0, 1.5, 1.0] |[1.0, 1.0] |[1.0, 1.5]|  ------------------------ ---------------- ----------