2011-06-28 88 views
2

我正在處理HBase地圖縮減作業,並需要了解單列家族中的列是否按其名稱(鍵)進行排序。如果是這樣,我不需要在洗牌階段做到這一點。HBase掃描是否返回排序列?

感謝

回答

-1

沒有,列不排序 它們在內部存儲爲鍵值對在長的字節數組。但是,你應該澄清一下你的問題,即你實際需要什麼。

+0

我的系統跟蹤某種事件。每行鍵是源ID和日期,每列是事件ID和數據。這種結構似乎是正確的,因爲我總是需要一整天的事件而不是單一的事件。分析事件時,我需要按ID排序。我通常會在map和sort/shuffle階段執行此操作,並將reduce的計算保留下來,但如果已經排序,我可以跳過它並在地圖階段執行整個計算。 – Huser

+0

如果您需要的所有數據都在一行中,那麼爲什麼不使用常規數據結構/操作將它排序在內存中呢?洗牌/分類/縮小階段非常昂貴。 – David

+1

列確實分類。請參閱:http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/24414 – jeffreyveon

1

我和你有一個非常相似的數據模型。然而,插入後,我爲Put對象的時間戳設置了自己的值。但是,我這樣做的方式是採用當前時間的「種子」,併爲每批持續批量生成的事件附加一個遞增計數器。

當我從掃描拉到結果出來,我寫了一個比較:

public class KVTimestampComparator implements Comparator<KeyValue> { 

    @Override 
    public int compare(KeyValue kv1, KeyValue kv2) { 
     Long kv1Timestamp = kv1.getTimestamp(); 
     Long kv2Timestamp = kv2.getTimestamp(); 

     return kv1Timestamp.compareTo(kv2Timestamp); 
    } 
} 

然後排序的原始行:

List<KeyValue> row = Arrays.asList(result.raw()); 
Collections.sort(row, new KVTimestampComparator()); 

得到這個想法從人誰回答了這個:Sorted results from hbase scanner