2016-08-02 53 views
1

我使用熊猫来创建一个大的索引HDF5表。我想重新命名表格中12列中的2列。我宁愿不重建/重新索引表。HDF5:有没有办法重命名现有HDF5表中的列名?

可这不复制所有数据(140GB)做些什么呢?我希望文件中只有几个元数据可以用正确的命令轻松地换出。

这次来到了我,因为我有几个“非天然”一栏包含空格的名字,并没有意识到这是一个问题,直到试图运行的SELECT语句。

+0

AFAIK有没有又一个“公平”的方式做到这一点,但你可以使用[此杰夫的黑客(http://stackoverflow.com/a/32082953/5741205) – MaxU

+0

好主意 - 虽然似乎不适合我,但也许是因为我有索引表。我根据Jeff的黑客修改了所有可以找到的“attrs”元数据 - 包括为我出现的一些额外字段 - 但“select”仍然无法识别新的列名称。当我执行s.get_storer('all')。table.colindexes时,我看到列仍以旧名称命名。 – eraoul

+0

是啊,有索引列,你有更多的“功课” ......检查'store.get_storer(“全部”)'你要重新命名,并尝试将其重命名列。还需要看看[PyTables的_f_rename()方法(http://www.pytables.org/usersguide/tutorials.html) – MaxU

回答

1

恐怕目前还没有办法来重命名索引(属于data_columns)列,因为这需要做在storer.table.colindexesstorer.table.description对象且二者的变化是特定类型的:

In [29]: store.get_storer('df').table 
Out[29]: 
/df/table (Table(10,)) '' 
    description := { 
    "index": Int64Col(shape=(), dflt=0, pos=0), 
    "a": Int32Col(shape=(), dflt=0, pos=1), 
    "b": Int32Col(shape=(), dflt=0, pos=2), 
    "c": Int32Col(shape=(), dflt=0, pos=3)} 
    byteorder := 'little' 
    chunkshape := (3276,) 
    autoindex := True 
    colindexes := { 
    "a": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "c": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "b": Index(6, medium, shuffle, zlib(1)).is_csi=False} 

In [30]: type(store.get_storer('df').table.colindexes) 
Out[30]: tables.table._ColIndexes 

In [31]: type(store.get_storer('df').table.description) 
Out[31]: tables.description.Description 

如果你尝试谷歌PyTables解决方案,你会发现这个问题,但有/没有答案,这将允许您重命名列。

所以,你可能要重新创建HDF5文件(S)

+0

是的,我已经得出了同样的结论。我想知道这是否是或HDF5的PyTables的限制,虽然,但现在它似乎是唯一的解决办法是重新创建文件。 – eraoul

相关问题