Spark Dataframes:在新列中附加列表(python)

时间:2016-05-12 08:50:51

标签: apache-spark dataframe

我有以下数据帧(数组中的值是字符串):

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

2 个答案:

答案 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")