【问题标题】:How do you upload data in bulk to Google App Engine Datastore?如何将数据批量上传到 Google App Engine Datastore?
【发布时间】:2010-10-19 00:02:43
【问题描述】:

我有大约 4000 条记录需要上传到 Datastore。

它们目前为 CSV 格式。如果有人愿意,我将不胜感激 指点我或解释如何将数据批量上传到 GAE。

【问题讨论】:

    标签: google-app-engine upload bulk google-cloud-datastore


    【解决方案1】:

    通过对多个实体使用远程 API 和操作。我将展示一个使用 python 的 NDB 示例,其中我们的 Test.csv 包含以下用分号分隔的值:

    1;2;3;4
    5;6;7;8
    

    首先我们需要导入模块:

    import csv
    from TestData import TestData
    from google.appengine.ext import ndb
    from google.appengine.ext.remote_api import remote_api_stub
    

    然后我们需要创建远程 api 存根:

    remote_api_stub.ConfigureRemoteApi(None, '/_ah/remote_api', auth_func, 'your-app-id.appspot.com')
    

    有关使用远程 api 的更多信息,请查看this answer

    然后是主代码,主要做了以下几件事:

    1. 打开 Test.csv 文件。
    2. 设置分隔符。我们使用分号。
    3. 然后您有两个不同的选项来创建实体列表:
      1. 使用 map reduce 函数。
      2. 使用列表理解。
    4. 最后,您批量放入整个实体列表。

    主要代码:

    # Open csv file for reading.
    with open('Test.csv', 'rb') as file:
        # Set delimiter.
        reader = csv.reader(file, delimiter=';')
    
        # Reduce 2D list into 1D list and then map every element into entity.
        test_data_list = map(lambda number: TestData(number=int(number)),
                reduce(lambda list, row: list+row, reader)
            )
    
        # Or you can use list comprehension.
        test_data_list = [TestData(number=int(number)) for row in reader for number in row]
    
        # Batch put whole list into HRD.
        ndb.put_multi(test_data_list)
    

    put_multi 操作还负责确保在单个 HTTP POST 请求中批处理适当数量的实体。

    查看此文档了解更多信息:

    【讨论】:

      【解决方案2】:

      以后版本的app engine sdk,可以使用appcfg.py上传

      appcfg.py

      【讨论】:

        【解决方案3】:

        我没有完美的解决方案,但我建议您使用App Engine Console。 App Engine Console 是一个免费插件,可让您在生产环境中运行交互式 Python 解释器。它有助于一次性数据操作(例如初始数据导入),原因如下:

        1. 它是老式的 read-eval-print 解释器。您可以一次做一件事情,而不必一次编写完美的导入代码并批量运行。
        2. 您可以交互式访问自己的数据模型,因此可以从数据存储中读取/更新/删除对象。
        3. 您可以交互式访问 URL Fetch API,因此您可以逐个提取数据。

        我建议如下:

        1. 让您的数据模型在您的开发环境中工作
        2. 将您的 CSV 记录拆分为小于 1,000 的块。将它们发布到 Amazon S3 或任何其他 URL 等位置。
        3. 在您的项目中安装 App Engine 控制台并将其投入生产
        4. 登录控制台。 (只有管理员可以使用控制台,所以您应该是安全的。您甚至可以将其配置为返回 HTTP 404 以“隐藏”未经授权的用户。)
        5. 对于 CSV 的每一块:
          1. 使用 URLFetch 拉取一大块数据
          2. 使用内置的csv 模块来分割数据,直到获得有用的数据结构列表(很可能是列表列表或类似的东西)
          3. 编写一个for循环,遍历列表中的每个数据结构:
            1. 创建具有所有正确属性的数据对象
            2. put() 到数据存储中

        您应该会发现,在通过 #5 的一次迭代之后,您可以复制和粘贴,或者编写简单的函数来加快您的导入任务。此外,通过在步骤 5.1 和 5.2 中获取和处理您的数据,您可以慢慢来,直到您确定自己拥有完美的数据。

        注意,App Engine 控制台目前最适合 Firefox。

        【讨论】:

        【解决方案4】:

        您可以使用bulkloader.py 工具:

        bulkloader.py 工具包含在 Python SDK 可以将数据上传到您的 应用程序的数据存储。只需一个 一点点设置,你可以创建 来自 CSV 文件的新数据存储实体。

        【讨论】:

        • 通过一些额外的工作,您甚至可以直接从 SQL 数据库或任何其他数据源加载数据。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多