#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]| ------------------------ ---------------- ----------