星火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与这种行为相对绝对,但它只是一个实现细节,并不是一般你可以依赖的东西。
答
我同意@ zero323。我只是想添加在新数据框中获得解决方案所需的转换。
val updatedDataframe = initialDataframe.map {
case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2))
}.toDF("col1", "col2", "col3")
感谢您的回答。你能澄清我永远不应该做的事吗?因为我完全不理解它,它似乎是我失踪的重要信息。 –
'list.extend'修改(改变)现有的'list'。不要对你的数据做这件事。总是返回一个新的对象,除非明确地允许做另外的事情(参见'RDD.fold','RDD.aggregate'等) – zero323