比HDF5更好的方式 - >熊猫 - > PostgreSQL的

时间:2016-08-16 23:35:01

标签: 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没有处理HDF5的本地或第三方数据包装器:PostgreSQL wiki article
  4. HDF5 ODBC驱动程序仍处于初期阶段:HDF5 ODBC blog
  5. 基本上来自HDF5 - >熊猫 - > PostgreSQL需要通过广泛的猴子补丁来克服障碍1和2。似乎没有直接的方式从HDF5 - > PostgreSQL直接。除非我遗漏了什么。

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

1 个答案:

答案 0 :(得分:3)

您可以使用以下内容转换为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()