我是Google App Engine的新手。
我需要做的是将一个非常大的CSV上传到CloudSQL。 我有一个HTML页面,其中有一个文件上传模块,上传时会到达Blobstore。
之后我用Blob阅读器打开CSV并使用cursor.execute执行每行到CloudSQL("插入表值")。这里的问题是我只能执行一分钟的HTTP请求,而不是所有数据都会在那么短的时间内插入。它还使屏幕处于加载状态,我希望通过使代码在后端运行来避免,如果可能的话?
我也试过去#34; LOAD DATA LOCAL INFILE"方式。
" LOAD DATA LOCAL INFILE"当我通过终端连接到CloudSQL时,可以从我的本地计算机上运行。它非常快。 我将如何在App Engine中使用它?
或者,从HTML上传CSV后,是否有更好的方法可以直接通过Blobstore或Google Cloud Storage将大型CSV导入CloudSQL? 此外,是否可以将任务队列与Blob Store一起使用,然后将数据插入到后端的CloudSQL中?
答案 0 :(得分:2)
我对数据存储使用了类似的方法而不是CloudSQL,但是同样的方法可以应用于您的方案。
设置应用程序的非默认模块(以前的后端,现已弃用)
发送一个http请求,该请求将通过任务队列触发模块端点(以避免60秒的截止日期)
使用带有CSV的mapreduce作为输入,并在map函数中对csv的每一行执行操作(以避免内存错误,并在操作期间出现任何错误时从其离开的位置恢复管道)
< / LI> 醇>编辑:根据OP请求详细说明地图缩减,并且还消除了任务队列的使用
下载mapreduce的相关性文件夹(simplejson,graphy,mapreduce)
将this文件下载到项目文件夹并另存为“custom_input_reader.py”
现在将以下代码复制到main_app.py文件中。
main_app.py
from mapreduce import base_handler
from mapreduce import mapreduce_pipeline
from custom_input_reader import GoogleStorageLineInputReader
def testMapperFunc(row):
# do process with csv row
return
class TestGCSReaderPipeline(base_handler.PipelineBase):
def run(self):
yield mapreduce_pipeline.MapPipeline(
"gcs_csv_reader_job",
"main_app.testMapperFunc",
"custom_input_reader.GoogleStorageLineInputReader",
params={
"input_reader": {
"file_paths": ['/' + bucketname + '/' + filename]
}
})
<强> main_app.py 强>
class BeginUpload(webapp2.RequestHandler):
# do whatever you want
upload_task = TestGCSReaderPipeline()
upload_task.start()
# do whatever you want
答案 1 :(得分:0)
您可以尝试通过云控制台导入CSV数据:
https://cloud.google.com/sql/docs/import-export?hl=en#import-csv