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