首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比HDF5 -> Pandas -> PostgreSQL更好

比HDF5 -> Pandas -> PostgreSQL更好
EN

Stack Overflow用户
提问于 2016-08-16 23:35:01
回答 1查看 2.8K关注 0票数 2

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

  1. pandas.read_hdf()仍然有一个摇摇欲坠的chunksize kwag:所以问题公开github发行
  2. pandas.DataFrame.to_sql()非常慢,效率很低:公开github发行 (请参阅我在问题页面底部的文章)
  3. PostgreSQL没有处理HDF5:PostgreSQL维基文章的本地或第三方数据包装器。
  4. HDF5 ODBC驱动程序还处于初级阶段:HDF5 ODBC博客

基本上,要从HDF5 -> Pandas -> PostgreSQL出发,就需要通过广泛的猴子修补来跨越第1和第2栏。从HDF5 -> PostgreSQL直接走似乎没有直接的路可走。除非我错过了什么。

也许你们中的一个优秀的用户可以暗示一些我缺少的东西,一些你创造的解决类似问题的零碎作品,或者任何的建议或建议.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-17 00:00:00

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

代码语言:javascript
复制
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

代码语言:javascript
复制
create table mytable (col1 bigint, col2 float, col3 float);
\copy mytable from 'output.csv' CSV

根据数据的复杂性,您可能会做一些聪明的事情,将模式从hdf5文件中提取出来,并使用它来生成CREATE TABLE语句。

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

代码语言:javascript
复制
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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38986034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档