星火Dataframes:在新的一列追加列表(蟒蛇)

问题描述:

我有以下数据框(内部数组的值是字符串):星火Dataframes:在新的一列追加列表(蟒蛇)

+--------------------+--------------------+ 
|    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,但它似乎只适用于字符串。

为什么不呢?使用Python类型提示list.extend是:

list.extend(iterable) -> None 

所以,你得到什么从extend返回。如果你想返回修改集合,你实际上应该返回col1,但请不要因为这里实际上有更糟糕的部分。

你应该从来没有在使用Spark时修改数据。虽然在这种特殊情况下你很安全,但可能会产生不可预测的后果。你可以在我对Will there be any scenario, where Spark RDD's fail to satisfy immutability.?的回答中找到可能的例子。尽管PySpark与这种行为相对绝对,但它只是一个实现细节,并不是一般你可以依赖的东西。

+0

感谢您的回答。你能澄清我永远不应该做的事吗?因为我完全不理解它,它似乎是我失踪的重要信息。 –

+1

'list.extend'修改(改变)现有的'list'。不要对你的数据做这件事。总是返回一个新的对象,除非明确地允许做另外的事情(参见'RDD.fold','RDD.aggregate'等) – zero323

我同意@ zero323。我只是想添加在新数据框中获得解决方案所需的转换。

val updatedDataframe = initialDataframe.map { 
    case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2)) 
    }.toDF("col1", "col2", "col3")