PySpark:TypeError:“行”对象不支持项目分配

Posted

技术标签:

【中文标题】PySpark:TypeError:“行”对象不支持项目分配【英文标题】:PySpark: TypeError: 'Row' object does not support item assignment 【发布时间】:2016-06-08 22:14:16 【问题描述】:

我使用以下代码将 DataFrame 行中的 None 值替换为空字符串:

def replaceNone(row):
  row_len = len(row)
  for i in range(0, row_len):
    if row[i] is None:
      row[i] = ""    
  return row

在我的 pyspark 代码中:

data_out = df.rdd.map(lambda row : replaceNone(row)).map(
  lambda row : "\t".join( [x.encode("utf-8") if isinstance(x, basestring) else str(x).encode("utf-8") for x in row])
)

然后我得到以下错误:

File "<ipython-input-10-8e5d8b2c3a7f>", line 1, in <lambda>
  File "<ipython-input-2-d1153a537442>", line 6, in replaceNone
TypeError: 'Row' object does not support item assignment

有人知道这个错误吗?如何将一行中的“无”值替换为空字符串?谢谢!

【问题讨论】:

试试df.replace('None',' ') 【参考方案1】:

Rowtuple 的子类,Python 中的tuples 是不可变的,因此不支持项目分配。如果你想替换存储在元组中的项目,你必须从头开始重建它:

## replace "" with placeholder of your choice 
tuple(x if x is not None else "" for x in row)  

如果您想简单地连接平面架构,将 null 替换为空字符串,您可以使用 concat_ws:

from pyspark.sql.functions import concat_ws

df.select(concat_ws("\t", *df.columns)).rdd.flatMap(lambda x: x)

要准备输出,使用spark-csv 并指定nullValuedelimiterquoteMode 更有意义。

【讨论】:

以上是关于PySpark:TypeError:“行”对象不支持项目分配的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark UDF - TypeError:“模块”对象不可调用

PySpark / Glue:PicklingError:无法序列化对象:TypeError:无法腌制thread.lock对象

pyspark pandas 对象作为数据框 - TypeError

PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象

Pyspark 数据框:访问列(TypeError:列不可迭代)

TypeError:元组索引必须是整数,而不是使用 pyspark 和 RDD 的 str