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

时间:2019-10-09 19:52:43

标签: python arrays apache-spark pyspark subtraction

好的,我有一个名为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|
+--------------------+----+--------------------+----+

1 个答案:

答案 0 :(得分:0)

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

Spark 是用于处理数据的引擎。它是用称为 Scala 的编程语言编写的,但是它还具有用于其他语言的API,例如 Python

Spark 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 标签。 / p>


您的错误表明,您正在尝试在列表上使用-运算符,而 Python 不支持该运算符。正确的 UDF 如下所示:

@udf (ArrayType(StringType()))

def udfsetdifference (l1, l2) : 
   return list(set(l1) ^ set(l2))