Чтение данных, обновление, а затем запись обратно в базу данных Spark - PullRequest
1 голос
/ 22 октября 2019

Я работаю над обработкой данных с использованием искры и кассандры.

Я хочу сначала прочитать и загрузить данные с Кассандры. Обработайте данные и запишите их обратно в cassandra.

Когда spark выполняет функцию карты, возникает ошибка - 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 Ответ

1 голос
/ 22 октября 2019

Ваше предложение абсолютно верно. Функция map преобразует входящий тип в другой тип. Это, по крайней мере, намерение. Поступающий объект является неизменным, чтобы сделать эту операцию идемпотентной. Я думаю, что нет никакого способа обойти объекты изображения (вручную или используя что-то вроде deepcopy)

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...