使用游标

时间:2018-05-04 05:45:50

标签: python google-app-engine google-cloud-datastore

我们在做什么?

我们正在处理云数据存储中的原始数据,并在清理和提取后将其放入 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
  3. ,则忽略持续存在

    第一个选项的问题是下一批处理将从头开始,我们将最终重新处理所有原始数据。

    第二种方法的问题是我们将多次处理最后一页的实体,因为我们还没有更新游标字符串。

    在重新插入 GBQ 之前,还没有有效的方法可以检查是否已经处理过 GBQ

    此外,没有太多关于游标的文档可以帮助我们忽略对任何实体的重新处理。什么可以帮助我们克服这个问题,有什么东西可以拯救我们吗?

1 个答案:

答案 0 :(得分:2)

next_cursorNone时,您应该只标记数据处理操作已完成且不会保留任何内容:没有剩余批次。

您不应该再次对同一数据运行批处理,因为导致重复的原因 - 您只需重新处理一个(或多个)已经重复的数据加工批次。