[好说我有一个名为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|
+--------------------+----+--------------------+----+
您用标签[[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标记。
您的错误表明,您正在尝试在列表上使用-
运算符,而@udf (ArrayType(StringType()))
def udfsetdifference (l1, l2) :
return set(l1) ^ set(l2)