我有 51 个巨大的 HDF5 表,每个表都有足够的(表现良好的)数据,我什至无法将其中一个完全加载到内存中。为了让团队其他成员的生活更轻松,我需要将此数据传输到 PostgreSQL 数据库(并删除 HDF5 表)。然而,说起来容易做起来难,主要是因为以下障碍:
pandas.read_hdf()
仍然有一个不稳定的chunksize
kwag:SO Question ; Open github issuepandas.DataFrame.to_sql()
极其缓慢且低效: Open github issue (请参阅问题页面底部我的帖子)- PostgreSQL 没有 native 或第三方数据包装器来处理 HDF5:PostgreSQL wiki article
- 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/