我们在做什么?
我们正在处理云数据存储中的原始数据,并在清理和提取后将其放入 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 之前,还没有有效的方法可以检查是否已经处理过 GBQ 。
此外,没有太多关于游标的文档可以帮助我们忽略对任何实体的重新处理。什么可以帮助我们克服这个问题,有什么东西可以拯救我们吗?
答案 0 :(得分:2)
当next_cursor
为None
时,您应该只标记数据处理操作已完成且不会保留任何内容:没有剩余批次。
您不应该再次对同一数据运行批处理,因为导致重复的原因 - 您只需重新处理一个(或多个)已经重复的数据加工批次。