簡體   English   中英

如何有效地掃描HBase行

[英]How to Scan HBase Rows efficiently

我需要編寫一個MapReduce Job來獲取給定Date Range中的所有行(比如說最后一個月)。 如果My Row Key以Date開頭,那將是一場輕松的嘗試。 但我頻繁的Hbase查詢是關鍵的起始值。

我的行鍵恰好是A | B | C | 20120121 | D. A / B / C與日期(以YearMonthDay格式)的組合形成唯一的行ID。

我的Hbase表可能有幾百萬行。 我的Mapper是否應該讀取所​​有表格並過濾掉每一行,如果它落在給定的日期范圍內,或者掃描/過濾器可以幫助處理這種情況?

有人可以建議(或代碼片段)以有效的方式處理這種情況嗎?

謝謝-Panks

帶有RegEx過濾器的RowFilter可以工作,但不是最佳解決方案。 或者,您可以嘗試使用二級索引。

另一個解決方案是嘗試FuzzyRowFIlter FuzzyRowFilter使用一種快進,因此在整個掃描過程中跳過許多行,因此比RowFilter Scan更快。 你可以在這里閱讀更多相關信息。

或者,BloomFilters也可能會有所幫助,具體取決於您的架構。 如果您的數據很大,您應該對二級索引和布隆過濾器進行比較分析。

您可以將RowFilterRegexStringComparator一起使用。 您需要提供適當過濾日期的RegEx。 此頁面包含一個示例,其中包括為MapReduce掃描程序設置過濾器。

我剛剛開始使用HBase, bloom過濾器可能有所幫助。

您可以修改發送到Mapper的掃描以包含過濾器。 如果您的日期也是記錄時間戳,則很容易:

Scan scan = new Scan();
scan.setTimeRange(minTime, maxTime);
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
     OutputKey.class, OutputValue.class, job);

如果行鍵中的日期不同,則必須在掃描中添加過濾器。 此過濾器可以對列或行鍵進行操作。 我認為只有行鍵才會變得混亂。 如果將日期放在列中,則可以創建一個FilterList ,其中所有條件都必須為true,並使用CompareOp.GREATERCompareOp.LESS 然后使用scan.setFilter(filterList)將過濾器添加到掃描中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM