使用App Engine Python将内容从BIG CSV上传到CloudSQL

时间:2015-08-10 07:16:57

标签: python google-app-engine csv google-cloud-storage google-cloud-sql

我是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中?

2 个答案:

答案 0 :(得分:2)

我对数据存储使用了类似的方法而不是CloudSQL,但是同样的方法可以应用于您的方案。

  1. 设置应用程序的非默认模块(以前的后端,现已弃用)

  2. 发送一个http请求,该请求将通过任务队列触发模块端点(以避免60秒的截止日期)

  3. 使用带有CSV的mapreduce作为输入,并在map函数中对csv的每一行执行操作(以避免内存错误,并在操作期间出现任何错误时从其离开的位置恢复管道)

    < / LI>

    编辑:根据OP请求详细说明地图缩减,并且还消除了任务队列的使用

    1. 从找到的文档here
    2. 中阅读mapreduce基础知识
    3. 下载mapreduce的相关性文件夹(simplejsongraphymapreduce

    4. this文件下载到项目文件夹并另存为“custom_input_reader.py”

    5. 现在将以下代码复制到main_app.py文件中。

    6. 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]
                          }
                  })
      
      1. 创建一个将启动地图作业的http处理程序
      2. <强> main_app.py

        class BeginUpload(webapp2.RequestHandler):
            # do whatever you want
            upload_task = TestGCSReaderPipeline()
            upload_task.start()
            # do whatever you want
        
        1. 如果要传递任何参数,请在“run”方法中添加参数,并在创建管道对象时提供值

答案 1 :(得分:0)

您可以尝试通过云控制台导入CSV数据:

https://cloud.google.com/sql/docs/import-export?hl=en#import-csv