python - 将 csv 从 gcs 迁移到 postgresql
问题描述
我正在尝试使用 python 脚本将 csv 文件从已从 BigQuery 导出的 Google Cloud Storage (GCS) 迁移到 PostgreSQL Google cloud sql 实例。
我希望使用 Google API,但在文档中发现了这一点:
PostgreSQL 实例不支持使用 Cloud SQL Admin API 导入 CSV 数据。
作为替代方案,我可以使用psycopg2
库并将 csv 文件的行流式传输到 SQL 实例中。我可以通过三种方式做到这一点
- 逐行:读取每一行然后提交插入命令然后提交
- 批处理流:读取每一行,然后提交插入命令,然后在 10 行或 100 行等之后提交。
- 整个 csv:读取每一行并提交插入命令,然后仅在文档末尾提交。
我担心这些 csv 文件可能包含数百万行,并且为上述三个选项中的任何一个运行此过程对我来说似乎是个坏主意。
我有什么选择?本质上,我在 BigQuery 中有一些原始数据,我们在导出到 GCS 之前对其进行了一些预处理,以准备导入到 PostgreSQL 实例。我需要将这些预处理数据从 BigQuery 导出到 PostgreSQL 实例。
这不是这个问题的重复,因为我最好寻找将数据从 BigQuery 导出到 PostgreSQL 实例的解决方案,无论它是通过 GCS 还是直接。
解决方案
您可以按照@GrahamPolley 的建议使用Cloud Dataflow执行导入过程。确实,此解决方案涉及一些额外的工作(熟悉 Dataflow、设置所有内容等)。即使有额外的工作,这将是您的情况的首选解决方案。但是,还有其他解决方案可用,我将在下面解释其中之一。
要使用 Dataflow 设置迁移过程,有关将 BigQuery 导出到 Google Datastore的本教程就是一个很好的示例
Cloud Dataflow 的替代解决方案
Cloud SQL for PostgreSQL 不支持从 a 导入,.CSV
但支持.SQL
文件。
指定 uri 的文件类型。
SQL:该文件包含 SQL 语句。
CSV:文件包含 CSV 数据。PostgreSQL 实例不支持使用 Cloud SQL Admin API 导入 CSV 数据。
一个直接的解决方案是使用一些工具将文件转换为.CSV
(.SQL
谷歌不提供我知道的工具,但网上有很多),然后导入到 PostgreSQL。
如果您想以更“编程”的方式实现此解决方案,我建议使用Cloud Functions,这是我将如何尝试执行此操作的示例:
- 设置在文件上传到 Cloud Storage 存储分区时触发的 Cloud Function
- 对函数进行编码以获取上传的文件并检查它是否为
.CSV
. 如果是,请使用 csv-to-sql API(此处为 API 示例)将文件转换为.SQL
- 将新文件存储在 Cloud Storage 中
- 导入到 PostgreSQL
推荐阅读
- ruby-on-rails - has_many 的 NoMethodError :尽管(nil:NilClass 的未定义方法 class_name)
- flutter - Flutter 使用流“RxDart”提交登录 Bloc
- node.js - 带有 virtualmin 和 postfix 的 nodemailer - 身份验证失败
- java-8 - 在纯文本连接器上启用 HTTP/2
- mysql - 来自mysql的两个不同数据库的两个表的联合
- r - 使用 pivot_longer 将多列从宽转换为长
- python - 下面提到的语法是什么意思?
- security - 带有 SSL 的 Laravel 5.4
- flutter - 从 Dart 中的 pem 编码字符串获取 ECDSAPublicKey、ECDSAPrivate
- python - 在 django 中实现评级