Python 如何将批量数据上载到appengine数据存储?旧方法不起作用

Python 如何将批量数据上载到appengine数据存储?旧方法不起作用,python,google-app-engine,google-cloud-storage,google-cloud-datastore,Python,Google App Engine,Google Cloud Storage,Google Cloud Datastore,这应该是一个相当常见的要求,也是一个简单的过程:将数据批量上传到appengine数据存储 然而,stackoverflow上提到的旧解决方案(下面的链接*)似乎都不再有效。bulkloader方法是使用DB API上传到数据存储时最合理的解决方案,但它不适用于NDB API 现在bulkloader方法似乎已被弃用,文档中仍然存在的旧链接导致错误页面。这里有一个例子 此页面上仍存在上述链接: 现在推荐的散装装载数据方法是什么 两个可行的替代方案似乎是1)使用远程api,或2)将CSV文件写入

这应该是一个相当常见的要求,也是一个简单的过程:将数据批量上传到appengine数据存储

然而,stackoverflow上提到的旧解决方案(下面的链接*)似乎都不再有效。bulkloader方法是使用DB API上传到数据存储时最合理的解决方案,但它不适用于NDB API

现在bulkloader方法似乎已被弃用,文档中仍然存在的旧链接导致错误页面。这里有一个例子

此页面上仍存在上述链接:

现在推荐的散装装载数据方法是什么

两个可行的替代方案似乎是1)使用远程api,或2)将CSV文件写入GCS存储桶并从中读取。有人有成功使用这两种方法的经验吗

任何指点都将不胜感激。谢谢

[*以下链接提供的解决方案不再有效]

[1]


[2]

远程API方法,如链接[1]中所示,仍然可以正常工作-尽管如果有几百行以上,则速度非常慢


我已经成功地将GCS与MapReduce框架结合使用,下载而不是上传数据存储的内容,但原则应该是相同的。请参阅:事实上,您只需要mapper步骤,这样您就可以定义一个简单的函数,该函数接受CSV中的一行,并根据该数据创建数据存储实体。

方法1:使用远程api

如何:编写一个bulkloader.yaml文件,并使用终端的“appcfg.py upload_data”命令直接运行它 我不推荐这种方法,原因有二:1。巨大的延迟2。不支持NDB

方法2:GCS和使用mapreduce

将数据文件上载到地面军事系统:

使用“”github项目(chunked_transfer.py)将文件从本地系统上载到gcs。 确保从app engine管理控制台生成正确的“client secrets.json”文件

Mapreduce:

使用“”github项目。将“mapreduce”文件夹复制到项目顶级文件夹

将以下行添加到app.yaml文件:

includes:
  - mapreduce/include.yaml
下面是您的main.py文件

import cgi
import webapp2
import logging
import os, csv
from models import DataStoreModel
import StringIO
from google.appengine.api import app_identity
from mapreduce import base_handler
from mapreduce import mapreduce_pipeline
from mapreduce import operation as op
from mapreduce.input_readers import InputReader

def testmapperFunc(newRequest):
    f = StringIO.StringIO(newRequest)
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        newEntry = DataStoreModel(attr1=row[0], link=row[1])
        yield op.db.Put(newEntry)

class TestGCSReaderPipeline(base_handler.PipelineBase):
    def run(self, filename):
        yield mapreduce_pipeline.MapreducePipeline(
                "test_gcs",
                "testgcs.testmapperFunc",
                "mapreduce.input_readers.FileInputReader",
                mapper_params={
                    "files": [filename],
                    "format": 'lines'
                },
                shards=1)

class tempTestRequestGCSUpload(webapp2.RequestHandler):
    def get(self):
        bucket_name = os.environ.get('BUCKET_NAME',
                                     app_identity.get_default_gcs_bucket_name())

        bucket = '/gs/' + bucket_name
        filename = bucket + '/' + 'tempfile.csv'

        pipeline = TestGCSReaderPipeline(filename)
        pipeline.with_params(target="mapreducetestmodtest")
        pipeline.start()
        self.response.out.write('done')

application = webapp2.WSGIApplication([
    ('/gcsupload', tempTestRequestGCSUpload),
], debug=True)
要记住:

  • Mapreduce项目使用现已弃用的“Google云存储文件API”。因此,未来的支持并不能保证
  • Map reduce为数据存储读取和写入增加了少量开销 方法3:GCS和GCS客户端库

  • 使用上述文件传输方法将csv/文本文件上传至地面军事系统
  • 使用gcs客户端库(将“cloudstorage”文件夹复制到应用程序顶级文件夹)
  • 将以下代码添加到应用程序main.py文件中

    import cgi
    import webapp2
    import logging
    import jinja2
    import os, csv
    import cloudstorage as gcs
    from google.appengine.ext import ndb
    from google.appengine.api import app_identity
    from models import DataStoreModel
    
    class UploadGCSData(webapp2.RequestHandler):
        def get(self):
            bucket_name = os.environ.get('BUCKET_NAME',
                                         app_identity.get_default_gcs_bucket_name())
            bucket = '/' + bucket_name
            filename = bucket + '/tempfile.csv'
            self.upload_file(filename)
    
        def upload_file(self, filename):
            gcs_file = gcs.open(filename)
            datareader = csv.reader(gcs_file)
            count = 0
            entities = []
            for row in datareader:
                count += 1
                    newProd = DataStoreModel(attr1=row[0], link=row[1])
                    entities.append(newProd)
    
                if count%50==0 and entities:
                    ndb.put_multi(entities)
                    entities=[]
    
            if entities:
                ndb.put_multi(entities)
    
    application = webapp2.WSGIApplication([
        ('/gcsupload', UploadGCSData),
    ], debug=True)
    

    从2018年开始,最好的方法就是使用。

    你们中的一些人可能会遇到我的情况:我不能使用数据存储的导入/导出实用程序,因为我的数据需要在进入数据存储之前进行转换

    我最终使用了()

    你只需要写几行“beam”代码就可以了

    • 读取您的数据(例如,托管在云存储上)-您将获得字符串的
      PCollection
    • 执行您想要的任何转换(这样您就可以获得数据存储实体的
      PCollection
    • 把它们扔掉
    有关具体用例,请参见


    我能够以每秒800个实体的速度,用5名工作人员写入我的数据存储。这使我能够在大约5小时内完成导入任务(1600万行)。如果你想让它更快,请使用更多的工人:D

    谢谢你,丹尼尔。我们正在研究这种方法;“将在此处发布有关其运行情况的更新。@Cygorger,按照mapreduce路径,您有何进展?”?我是GAE的新手,我想将一些数据从现有系统导入数据存储,这样我就可以开始使用它了,但我不知道从哪里开始上传我的数据。@opensourcegeek sriram发布的方法有效。希望有帮助!上面的文档链接是从2014年开始的,我们想知道它是否仍然适用于2017年。方法3将超时处理大量数据,除非您拆分大型CSV。@sh4dydud3_88 yes。这就是为什么我更喜欢mapreduce方法处理大量数据的原因。此外,将CSV拆分为每个CSV 20k个实体的块也很好。在有
    gsutil
    的情况下,谈论使用python脚本将文件上载到GCS似乎有点愚蠢,这使得在终端中使用
    cp
    命令一样简单。一个人在使用时是否需要包含mapreduce.yaml和queue.yaml文件解决方案#2?只需从github下载mapreduce文件夹,并将整个目录复制到项目根文件夹中即可。我已经阅读了该文档好几次,但仍然感到困惑。它似乎是专门为导入以前导出的数据而设计的。如何设置导入数据的格式?那一页似乎没有解释。如果不是这样,你能给我举一个如何将CSV/TSV文件上传到数据存储的例子吗?@Jared Nedzel,我和你的情况一样。请看我的答案,这可能对你也有帮助。请修复断开的链接