PySpark:TypeError:'Row'对象不支持项目赋值

时间:2016-06-08 22:14:17

标签: python pyspark apache-spark-sql

我使用以下代码将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

有没有人对错误有任何想法?如何将行中的“无”值替换为空字符串?谢谢!

1 个答案:

答案 0 :(得分:4)

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会更有意义。