我正在使用spark和cassandra进行数据处理。
我想做的是首先从cassandra中读取并加载数据。处理数据并将其写回cassandra。
当spark执行map功能时,会发生错误-Row is read-only <class 'Exception'>
这是我的方法。如下所示
def detect_image(image_attribute):
image_id = image_attribute['image_id']
image_url = image_attribute['image_url']
if image_attribute['status'] is None:
image_attribute['status'] = Status()
image_attribute['status']['detect_count'] += 1
... # the other item assignment
cassandra_data = sql_context.read.format("org.apache.spark.sql.cassandra").options(table="photo",
keyspace="data").load()
cassandra_data_processed = cassandra_data.rdd.map(process_batch_image)
cassandra_data_processed.toDF().write \
.format("org.apache.spark.sql.cassandra") \
.mode('overwrite') \
.options(table="photo", keyspace="data") \
.save()
错误Row is read-only <class 'Exception'>
在行中
image_attribute['status'] = Status()
和
image_attribute['status']['detect_count'] += 1
是否有必要将image_attribute
复制为新对象?但是,image_attribute是一个嵌套对象。一层一层地复制很难。
答案 0 :(得分:1)
您的建议绝对正确。 map函数将传入类型转换为另一种类型。那至少是你的意图。传入对象是不可变的,以使该操作成为幂等。我想没有办法复制图像对象(手动或使用类似deepcopy
的东西)
希望有帮助