我有以下数据帧(数组中的值是字符串):
+--------------------+--------------------+
| col1| col2|
+--------------------+--------------------+
| [value1, value2]| [value3,value4]|
| [value5]| [value6]|
+--------------------+--------------------+
如何使用包含
的所有值的新数组创建新列+--------------------+--------------------+------------------------------+
| col1| col2| new |
+--------------------+--------------------+------------------------------+
| [value1, value2]| [value3,value4]|[value1, value2,value3,value4]|
| [value5]| [value6]| [value5,value6]|
+--------------------+--------------------+------------------------------+
我尝试了以下内容:
def add_function(col1,col2):
return col1+col2
udf_add = udf(add_function,ArrayType(StringType()))
dftrial.withColumn("new",udf_add("col1","col2")).show(2)
它确实按需执行任务。但是当我将add_function
修改为:
def add_function(col1,col2):
return col1.extend(col2)
返回null
值。为什么?
我的主要问题是:还有另一种方法来实现这个任务,任何已经实现的功能?我发现concat
但它似乎只适用于字符串。
答案 0 :(得分:1)
为什么不呢?使用Python类型提示list.extend
是:
list.extend(iterable) -> None
因此,您可以准确地获得extend
返回的内容。如果你想返回修改集合,你应该实际返回col1
,但请不要,因为这里实际上有更糟糕的部分。
使用Spark时,您应该从不修改数据。虽然在这种特殊情况下您是安全的,但它可能会产生不可预测的后果。您可以在我对Will there be any scenario, where Spark RDD's fail to satisfy immutability.?的回答中找到可能的示例。虽然PySpark与这样的行为相对绝缘,但它只是一个实现细节,而不是你可以依赖的东西。
答案 1 :(得分:0)
我同意@ zero323。我只想添加在新数据帧中获得解决方案所需的转换。
val updatedDataframe = initialDataframe.map {
case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2))
}.toDF("col1", "col2", "col3")