Python 比较两个阵列并得出PySpark中的差异

Python 比较两个阵列并得出PySpark中的差异,python,pyspark,apache-spark-sql,spark-dataframe,apache-spark-mllib,Python,Pyspark,Apache Spark Sql,Spark Dataframe,Apache Spark Mllib,我在一个数据帧中有两个数组字段 我需要比较这两个数组,并在同一数据帧中作为数组(新列)获得差异 预期产出为: B列是a列的一个子集。在两个数组中,单词的顺序也将相同 有谁能帮我找到解决方案吗?您可以使用用户定义的函数。我的示例dataframe与您的有所不同,但代码应该可以正常工作: import pandas as pd from pyspark.sql.types import * #example df df=sqlContext.createDataFrame(pd.DataFra

我在一个数据帧中有两个数组字段

我需要比较这两个数组,并在同一数据帧中作为数组(新列)获得差异

预期产出为:

B列是a列的一个子集。在两个数组中,单词的顺序也将相同


有谁能帮我找到解决方案吗?

您可以使用用户定义的函数。我的示例dataframe与您的有所不同,但代码应该可以正常工作:

import pandas as pd
from pyspark.sql.types import *

#example df
df=sqlContext.createDataFrame(pd.DataFrame(data=[[["hello", "world"], 
["world"]],[["sample", "overflow", "text"], ["sample", "text"]]], columns=["A", "B"]))

# define udf
differencer=udf(lambda x,y: list(set(x)-set(y)), ArrayType(StringType()))
df=df.withColumn('difference', differencer('A', 'B'))
编辑:

如果存在重复项,则此操作无效,因为集合仅保留唯一项。因此,您可以对udf进行如下修改:

differencer=udf(lambda x,y: [elt for elt in x if elt not in y] ), ArrayType(StringType()))

由于Spark 2.4.0,使用array_可轻松解决此问题。 以身作则

from pyspark.sql import functions as F

#example df
df=sqlContext.createDataFrame(pd.DataFrame(data=[[["hello", "world"], 
["world"]],[["sample", "overflow", "text"], ["sample", "text"]]], columns=["A", "B"]))


df=df.withColumn('difference', F.array_except('A', 'B'))
对于阵列上的更多类似操作,我建议使用本文

非常感谢ags29。它确实像一个符咒一样工作:-)只有一个疑问,它也会删除重复项。有没有办法保留所有值?再次感谢…它现在保留了重复项:-)我不得不在命令中添加一个列表,我想您忘记添加了…differenticer=udf(lambda x,y:list([elt表示elt在x中,如果elt不在y中]),ArrayType(StringType())@ags29-只是编辑部分的语法更改,在
差异中。它应该是
differenticer=udf(lambda x,y:[如果elt不在y中,则elt代表x中的elt],数组类型(StringType())