读取数据,更新,然后通过Spark写回DB

时间:2019-10-22 04:31:06

标签: apache-spark pyspark

我正在使用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是一个嵌套对象。一层一层地复制很难。

1 个答案:

答案 0 :(得分:1)

您的建议绝对正确。 map函数将传入类型转换为另一种类型。那至少是你的意图。传入对象是不可变的,以使该操作成为幂等。我想没有办法复制图像对象(手动或使用类似deepcopy的东西)

希望有帮助