Python 如何将批量数据上载到appengine数据存储?旧方法不起作用
这应该是一个相当常见的要求,也是一个简单的过程:将数据批量上传到appengine数据存储 然而,stackoverflow上提到的旧解决方案(下面的链接*)似乎都不再有效。bulkloader方法是使用DB API上传到数据存储时最合理的解决方案,但它不适用于NDB API 现在bulkloader方法似乎已被弃用,文档中仍然存在的旧链接导致错误页面。这里有一个例子 此页面上仍存在上述链接: 现在推荐的散装装载数据方法是什么 两个可行的替代方案似乎是1)使用远程api,或2)将CSV文件写入GCS存储桶并从中读取。有人有成功使用这两种方法的经验吗 任何指点都将不胜感激。谢谢 [*以下链接提供的解决方案不再有效] [1]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文件写入
[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)
要记住:
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,我和你的情况一样。请看我的答案,这可能对你也有帮助。请修复断开的链接