【问题标题】:How to load a large CSV file to Postgresql RDS in AWS using Python3如何使用 Python3 将大型 CSV 文件加载到 AWS 中的 Postgresql RDS
【发布时间】:2019-11-20 11:14:16
【问题描述】:

我有一个 20 GB 的 csv 文件,其中包含 50 列和 5000 万条记录。我想使用 Python3 自动将巨大的 csv 文件加载到我的 RDS postgresql 实例中。此 csv 文件存储在 S3 存储桶中。 对此的任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: postgresql python-3.6 amazon-rds


    【解决方案1】:

    首先安装 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()
    

    【讨论】:

    • 这个链接也很有用。 mydatahack.com/…
    • 上述方法会比使用带有“chunksize”和“multi”方法的 Pandas “to_sql”更快吗?
    【解决方案2】:

    RDS 有一个特殊的extension to PostgreSQL 用于从 S3 导入数据。您可以使用 python 的 psycopg2 来调用 aws_s3.table_import_from_s3() SQL 函数,但是这样做并没有什么特别“pythonic”的东西,任何其他向数据库发出命令的方式都可以。

    如果您出于某种原因不喜欢这样,您可以使用python library 从 S3 打开一个流,然后将该类文件对象传递给 psycopg2 的 copy_from 或 copy_expert。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多