Что мы делаем?
У нас есть необработанные данные в облачном хранилище данных , которые мы обрабатываем и после очистки и извлечения помещаем в GBQ для анализа.
Так как у нас есть очень большие данные, мы очищаем их в пакетах и сохраняем строку курсора, чтобы начать следующий пакет справа от того места, где мы оставили в предыдущем пакете.
Фрагмент кода
#read cursor string and create cursor object
start_cursor = Cursor(urlsafe=tag_generated_till_cursor_string)
entities_list, next_cursor, more = ndbEntity.query().order(ndbEntity.updated_date)\
.fetch_page(500, start_cursor=start_cursor)
if next_cursor:
# persisting next_cursor.urlsafe()
Выглядит хорошо до сих пор?
Теперь выпуск?
У нас возникли проблемы с обработкой списка конечных объектов, когда мы закончили обработку всех объектов такого типа.
Как и после достижения в конце, мы получим next_cursor
как Нет , поэтому есть две вещи, которые можно сделать: -
- Сохраняется Нет
- Игнорировать сохранение, если
next_cursor
равно Нет
Проблема с первой опцией будет в следующей пакетной обработке, которая начнется с начала, и мы закончим повторную обработку всех необработанных данных.
Проблема второго подхода заключается в том, что мы будем обрабатывать объекты последней страницы несколько раз, поскольку в последнем пакете мы не обновляли строку курсора.
Оба из них не будут работать с нами, также нет эффективного способа проверки, если он уже обработан в GBQ перед его повторной вставкой.
Также не так много документации о курсорах, которая может помочь нам игнорировать повторную обработку любых объектов. Что может помочь нам в преодолении этой проблемы, есть ли что-то, что может спасти нас от этого?