【问题标题】:In PySpark DataFrames, why is __setitem__ not fully implemented?在 PySpark DataFrames 中,为什么 __setitem__ 没有完全实现?
【发布时间】:2019-01-12 23:55:43
【问题描述】:

在 PySpark 中,我们不能使用传统的 pandas 或 R 样式的符号来基于 DataFrame 中的旧列创建新列。例如,假设我尝试连接两列:

import pyspark.sql.functions as F
df['newcol'] = F.concat(df['col_1'], df['col_2'])

结果:

TypeError: 'DataFrame' object does not support item assignment

相反,实现的方法是

df = df.withColumn('newcol', F.concat(df['col_1'], df['col_2']))

PySpark 没有实现传统的 DataFrame 表示法是否有原因?

【问题讨论】:

    标签: apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    您可以找到实现这种方式的多种原因以及一些反例(SparkR API),但它认为根本原因是实现纯度。

    与 R 或 Pandas 数据帧不同,Spark DataFrame 是不可变的数据结构。架构的每一次更改都会创建一个全新的DataFrame,因此任何其他建议的操作都只会产生误导。

    理论上,通过替换对 JVM 的引用 DataFrame 可以侥幸实现 __setitem__,但如果您认为 DataFrame 的身份几乎可以由 _jdf 确定,这将是非常不合逻辑的。

    【讨论】:

    • 我想我明白了。换句话说,传统的数据帧是可变对象(向量列表),而 Spark 数据帧是不可变的,因为 Spark 是在函数式编程模型中设计的。 __setitem__ 是一种突变,不适用于不可变对象。
    • 是的,完全正确...您可以自己实现它并使用猴子补丁,但它会闻起来很腥。
    猜你喜欢
    • 2015-07-14
    • 2020-03-17
    • 2017-08-08
    • 2013-09-02
    • 2017-01-25
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多