Определение конца объектов в облачном хранилище данных с помощью курсора - PullRequest
0 голосов
/ 04 мая 2018

Что мы делаем?

У нас есть необработанные данные в облачном хранилище данных , которые мы обрабатываем и после очистки и извлечения помещаем в 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 как Нет , поэтому есть две вещи, которые можно сделать: -

  1. Сохраняется Нет
  2. Игнорировать сохранение, если next_cursor равно Нет

Проблема с первой опцией будет в следующей пакетной обработке, которая начнется с начала, и мы закончим повторную обработку всех необработанных данных.

Проблема второго подхода заключается в том, что мы будем обрабатывать объекты последней страницы несколько раз, поскольку в последнем пакете мы не обновляли строку курсора.

Оба из них не будут работать с нами, также нет эффективного способа проверки, если он уже обработан в GBQ перед его повторной вставкой.

Также не так много документации о курсорах, которая может помочь нам игнорировать повторную обработку любых объектов. Что может помочь нам в преодолении этой проблемы, есть ли что-то, что может спасти нас от этого?

1 Ответ

0 голосов
/ 04 мая 2018

Когда next_cursor равно None, следует просто отметить, что операция обработки данных завершена, и не сохранять ничего: не осталось пакетов.

Вы не должны снова запускать пакетную обработку для тех же данных, так как именно это вызывает дубликаты - вам нужно будет повторно обработать только одну (или более) из уже обработанных партий.

...