postgresql - 比 HDF5 -> Pandas -> PostgreSQL 更好的方法

标签 postgresql pandas hdf5 large-data

我有 51 个巨大的 HDF5 表,每个表都有足够的(表现良好的)数据,我什至无法将其中一个完全加载到内存中。为了让团队其他成员的生活更轻松,我需要将此数据传输到 PostgreSQL 数据库(并删除 HDF5 表)。然而,说起来容易做起来难,主要是因为以下障碍:

  1. pandas.read_hdf() 仍然有一个不稳定的 chunksize kwag:SO Question ; Open github issue
  2. pandas.DataFrame.to_sql() 极其缓慢且低效: Open github issue (请参阅问题页面底部我的帖子)
  3. PostgreSQL 没有 native 或第三方数据包装器来处理 HDF5:PostgreSQL wiki article
  4. HDF5 ODBC 驱动程序仍处于初级阶段:HDF5 ODBC blog

基本上,从 HDF5 -> Pandas -> PostgreSQL,需要通过大量的猴子修补来克服障碍 1 和 2。而且似乎没有直接的方法可以直接从HDF5 -> PostgreSQL。除非我错过了什么。

也许你们中的一位优秀用户可以暗示我所缺少的东西,您为克服类似问题而创建的一些拼凑作品,这将有助于我的事业,或者任何建议或建议......

最佳答案

您可以使用如下内容转换为 CSV:

import csv
import h5py
with h5py.File('input.hdf5') as hdf5file:
    with open('output.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
        for row in hdf5file['__data__']['table']:
            writer.writerow(row)

然后使用psql导入到postgres中:

create table mytable (col1 bigint, col2 float, col3 float);
\copy mytable from 'output.csv' CSV

根据数据的复杂性,您可能可以采取一些巧妙的措施从 hdf5 文件中获取架构,并使用它来创建 CREATE TABLE 语句。

或者,您可以尝试在 Python 脚本中编写自己的 INSERT 语句,这可能比使用 COPY 慢,但可能是一个更简单的解决方案:

import psycopg2
from itertools import islice

with h5py.File('input.hdf5') as hdf5file:
    with psycopg2.connect("dbname=mydb user=postgres") as conn
        cur = conn.cursor()
        chunksize=50
        t = iter(hdf5file['__data__']['table'])
        rows = islice(t, chunksize)
        while rows != []:
            statement = "INSERT INTO mytable VALUES {}".format(','.join(rows))
            cur.execute(row)
            rows = islice(t, chunksize)
        conn.commit()

关于postgresql - 比 HDF5 -> Pandas -> PostgreSQL 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38986034/

相关文章:

postgresql - Postgres : relation does not exist error when table exists on public schema

sql - PL/pgSQL : Add static column to query result

postgresql - 如何求和

python - 如何获得比 numpy.dot 更快的代码用于矩阵乘法?

python - 用pytables压缩数组

postgresql - PostGIS:创建扩展失败

python - Pandas groupby 和 qcut

python - 如何比较 Pandas 的频率/采样率?

python - 如何从 Python 中并排绘制多个饼图?

hdf5 - 如何合并多个 .h5 文件?