【问题标题】:Spark Dataframes: appending list in a new column(python)Spark Dataframes:在新列中附加列表(python)
【发布时间】:2016-05-12 08:50:51
【问题描述】:

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

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

【问题讨论】:

    标签: apache-spark dataframe


    【解决方案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 与此类行为相对隔离,但它只是一个实现细节,而不是您通常可以依赖的东西。

    【讨论】:

    • 感谢您的回答。你能澄清我不应该做什么吗?因为我没有完全理解它,而且它似乎是我遗漏的重要信息。
    • list.extend 修改(变异)现有的list。不要对您的数据执行此操作。除非明确允许这样做,否则始终返回一个新对象(请参阅RDD.foldRDD.aggregate 等)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2016-10-25
      • 2019-04-13
      • 2021-11-13
      相关资源
      最近更新 更多