2016-03-03 84 views
1

我試圖將一些數據從Hbase移植到ORC以改善寫入性能。在Hbase中,我的數據總共存儲在10個列中,而不是一個rowkey。現在,當我們使用Hbase時,我們不必擔心這些列的稀疏性。即使在大多數行只有兩列非零值的情況下,也是可以的,因爲Hbase只能存儲2列。存儲稀疏數據使用ORC

我移植數據時的第一個直覺就是將上述列限定符轉換爲與地圖的值關係。但是,這對於檢索來說效率不高。我試圖理解ORC是如何解釋空值的 - 如果我將值存儲爲10個單獨的列而不是地圖會更好嗎?在最壞的情況下,這個矩陣非常稀疏。

回答

0

ORC的寫入性能可能比Hbase差,ORC用於讀取大量使用情況,並針對存儲大量排序數據進行了優化。這是它閃耀的時候。大多數功能是圍繞加快讀取查詢進行組織的,比如謂詞下推。我認爲,在不瞭解您的數據的情況下,Hbase可能是編寫繁重操作的更好解決方案。回答你的問題:由於ORC是一種列狀導向格式,因此幾乎必須將數據分割爲不同的列。它確實處理稀疏數據。

+0

你能詳細說明爲什麼你說它處理稀疏數據非常好嗎?我目前正在調查ORC的閱讀量大的用例。我正在寫入ORC的對象都包含一個枚舉值列表。我目前的計劃是將每個枚舉值作爲ORC中的單獨列進行編碼,但有點擔心,因爲我找不到有關它如何處理稀疏數據的任何信息。您可以提供的任何信息都非常有價值。謝謝! –

+0

在下面回答了我的問題。謝謝! –

0

ORC documentation

在ORC文件,每列存儲在被相鄰存儲在文件中幾個流。例如,一個整數列是,表示爲兩個流:PRESENT,如果該值非空,則使用每個值記錄一位的記錄;以及記錄非空值的DATA。如果條帶中的所有列值都非空,則從條帶中省略PRESENT流。

這意味着,在最壞的情況下,每個空值的成本只有,只有一位。在一般情況下,如果您指定壓縮算法,ORC會進一步壓縮這些流。所以你最終可能會遇到一個空值讓你的方式少於一位的情況。

這就是說,很難說如果這對您的特定應用程序更有效。如果您需要從每行讀取特定值(即:列),那麼您的讀取性能可能會提高很多。如果您的讀取是有條件的,例如:如果COL2 ==「someValue」,因爲ORC具有支持跳過列塊的索引,I/O可以進一步改進。