【发布时间】:2019-11-20 11:14:16
【问题描述】:
我有一个 20 GB 的 csv 文件,其中包含 50 列和 5000 万条记录。我想使用 Python3 自动将巨大的 csv 文件加载到我的 RDS postgresql 实例中。此 csv 文件存储在 S3 存储桶中。 对此的任何帮助表示赞赏。谢谢。
【问题讨论】:
标签: postgresql python-3.6 amazon-rds
我有一个 20 GB 的 csv 文件,其中包含 50 列和 5000 万条记录。我想使用 Python3 自动将巨大的 csv 文件加载到我的 RDS postgresql 实例中。此 csv 文件存储在 S3 存储桶中。 对此的任何帮助表示赞赏。谢谢。
【问题讨论】:
标签: postgresql python-3.6 amazon-rds
首先安装 psycopg2:
pip install psycopg2
创建表(根据需要修改 sql):
conn = psycopg2.connect("dbname=dbname user=user")
cur = conn.cursor()
cur.execute("""CREATE TABLE sometablename(
some_col integer PRIMARY KEY,
some_col1 text,
some_col2 text,
some_col3 text)""")
conn.commit()
加载数据:
import psycopg2
conn = psycopg2.connect("host=localhost dbname=postgres user=postgres")
cur = conn.cursor()
with open('your_file.csv', 'r') as f:
next(f) # Skip the header row.
cur.copy_from(f, 'sometablename', sep=',')
conn.commit()
另一种方法是通过子流程:
host = "YOUR_HOST"
username = "YOUR_USERNAME"
dbname = "YOUR_DBNAME"
table_name = "my_table"
file_name = "my_10gb_file.csv"
command = "\copy {} FROM '{}' DELIMITER ',' CSV HEADER".format(table_name, file_name)
psql_template = 'psql -p 5432 --host {} --username {} --dbname {} --command "{}"'
bash_command = psql_template.format(host, username, dbname, command.strip())
process = subprocess.Popen(bash_command, stdout=subprocess.PIPE, shell=True)
output, error = process.communicate()
【讨论】:
RDS 有一个特殊的extension to PostgreSQL 用于从 S3 导入数据。您可以使用 python 的 psycopg2 来调用 aws_s3.table_import_from_s3() SQL 函数,但是这样做并没有什么特别“pythonic”的东西,任何其他向数据库发出命令的方式都可以。
如果您出于某种原因不喜欢这样,您可以使用python library 从 S3 打开一个流,然后将该类文件对象传递给 psycopg2 的 copy_from 或 copy_expert。
【讨论】: