如何从另一个字符串数组中减去一个字符串数组?

问题描述 投票:1回答:2

[好说我有一个名为Joinarrays的DataFrame,它包含3列,其中2列是数组。我在这2个中有一个字符串数组,我想在两种数组类型之间有所作为。这是一些示例输出,这将使其更有意义。

 col1                                   col2                       diffcol
 ['Jack', 'Bill', 'George', 'Rose']     ['Jack', 'Rose', 'Robert']  ['Bill', 'George', 'Robert]

我像这样创建了一个udf

@udf (ArrayType(StringType()))

def udfsetdifference (l1, l2) : 
   return l1 - l2

我使用了两个列,然后尝试将其添加到我已经拥有的DataFrame中。像这样:

diff = udfsetdifference(joinedarrays.col1, joinedarrays.col2)

我遇到以下错误

TypeError: unsupported operand type(s) for -: 'list' and 'list' 

[当我尝试像这样将差异列添加到DataFrame时

joinedarrays = joinedarrays.withColumn('diff', diff)

我对数组减法还有些陌生,所以希望我能准确地解释一切。

这里是演出的内容(尽管这与我之前提供的数据不同,但我正在尝试一个更通用的示例,并将其专门应用于此数据)。

+--------------------+----+--------------------+----+
|        collect_list|year|     receivedontsend|diff|
+--------------------+----+--------------------+----+
|[Egypt, Equatoria...|2010|[Romania, Ireland...|null|
|[Egypt, Costa Ric...|2011|[Saint Martin, Gu...|null|
|[Egypt, Costa Ric...|2012|[Croatia, Ireland...|null|
|[Egypt, Equatoria...|2013|[Romania, Croatia...|null|
|[Egypt, Costa Ric...|2014|[Saint Martin, Ro...|null|
|[Egypt, Costa Ric...|2015|[Romania, Croatia...|null|
+--------------------+----+--------------------+----+
python arrays apache-spark pyspark subtraction
2个回答
0
投票

您用标签[[Scala标记了您的问题,但是您的UDFPython编写,所以我想您可能会混淆。

Spark

是用于处理数据的引擎。它是用称为[[Scala的编程语言编写的,但是它也具有用于其他语言的API,例如PythonSpark Scala API与Python的语法略有不同。您可以像定义您的UDF

def udfsetdifference = udf { (l1: Seq[String], l2: Seq[String]) => l1.diff(l2) ++ l2.diff(l1) } 然后您可以这样称呼:

df.withColumn("diffcol", udfsetdifference('col1, 'col2))

如果要使用Python获得答案,请重新标记问题并删除

Scala
标记,并添加

Python和pyspark标记。

您的错误表明,您正在尝试在列表上使用-运算符,而
Python
不支持。正确的[[UDF
看起来像:

@udf (ArrayType(StringType())) def udfsetdifference (l1, l2) : return set(l1) ^ set(l2)


0
投票
我不再获取null。