2016-08-02 80 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

相關問題