Разница двух столбцов списка в Pyspark - PullRequest
1 голос
/ 02 октября 2019

У меня есть фрейм данных с двумя столбцами типа списка. Я пытаюсь получить третий столбец, который дает мне разницу этих двух столбцов в виде списка в столбце.

Например:

Предположим, что приведенный ниже кадр данных с 2 столбцами:

+--------------+------------+
|          col1|        col2|
+--------------+------------+
|[10, 20,30,40]|    [10, 20]|
+--------------+------------+

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

+--------------+------------+---------+
|          col1|        col2|    col3 |
+--------------+------------+---------+
|[10, 20,30,40]|    [10, 20]| [30, 40]|
+--------------+------------+---------+

вот некоторый код для создания образца фрейма данных

df = spark.createDataFrame([(["10","20","30"],["10","20","30"])]["age","id"])

df.show()
+------------+------------+
|         age|          id|
+------------+------------+
|[10, 20, 30]|[10, 20, 30]|
+------------+------------+

df.select(df.age - df.id).show()

Я пытался различными способами, как указано выше, но не смог его решить.

1 Ответ

0 голосов
/ 02 октября 2019

Вы ищете array_except (col1, col2), который возвращает элементы, которые присутствуют в col1, но отсутствуют в col2 без дубликатов .

from pyspark.sql import functions as F

df = spark.createDataFrame([(["10","20","30"],["10","20","30"]), (["10","20","30"],["10","20"]), (["10","20","30"],["10","20","50"])],["age","id"])

df=df.withColumn('col3', F.array_except('age', 'id'))

#In case you want to get the difference between both columns
#df=df.withColumn('col3', F.array_union(F.array_except('age', 'id'), F.array_except('id', 'age')))

df.show()

Вам нужно использовать udf, если вы работаете со свечой <2.4: </p>

from pyspark.sql import types as T
from pyspark.sql import functions as F

df = spark.createDataFrame([(["10","20","30"],["10","20","30"]), (["10","20","30"],["10","20"]), (["10","20","30"],["10","20","50"])],["age","id"])

def arrayDiff(col1, col2):
    #set will remove duplicates
    diff = set(col1) - set(col2)
    return list(diff)

diff=F.udf(arrayDiff, T.ArrayType(T.StringType()))

df=df.withColumn('col3', diff('age', 'id'))

df.show()

Вывод:

+------------+------------+----+ 
|         age|          id|col3| 
+------------+------------+----+ 
|[10, 20, 30]|[10, 20, 30]|  []| 
|[10, 20, 30]|    [10, 20]|[30]| 
|[10, 20, 30]|[10, 20, 50]|[30]| 
+------------+------------+----+
...