[英]Lead and lag in Hbase
我正在嘗試找出如何在Hbase中執行與Oracle的LEAD和LAG等效的方法或其他可以解決我的問題的模式。 我可以編寫一個很容易做到這一點的MapReduce程序,但是我很想能夠利用這樣的事實,即數據已經按照我需要的方式進行了排序。
我的問題如下:我有一個行鍵和一個值,看起來像:
(employee name + timestamp) => data:salary
因此,一些示例數據可能是:
miller, bob;2010-01-14 => data:salary=90000
miller, bob;2010-11-04 => data:salary=102000
miller, bob;2011-12-03 => data:salary=107000
monty, fred;2010-04-10 => data:salary=19000
monty, fred;2011-09-09 => data:salary=24000
我要做的是逐條記錄計算工資的變化。 我想將上述數據轉換為記錄之間的差異:
miller, bob;2010-01-14 => data:salarydiff=90000
miller, bob;2010-11-04 => data:salarydiff=12000
miller, bob;2011-12-03 => data:salarydiff=5000
monty, fred;2010-04-10 => data:salarydiff=19000
monty, fred;2011-09-09 => data:salarydiff=5000
如果需要,我打算更改行鍵策略。
我要做的是更改密鑰,以使時間戳記遞減(新工資先發)
miller, bob;2011-12-03 => data:salary=107000
miller, bob;2010-11-04 => data:salary=102000
miller, bob;2010-01-14 => data:salary=90000
現在,您可以做一個簡單的地圖工作,它將掃描表格。 然后在地圖中創建一個新的“掃描到當前鍵”。 Scan.next獲取以前的薪水,計算差異並將其存儲在當前行鍵的新列中
基本上在您的mapper類(繼承TableMapper的類)中,您將覆蓋setup方法並獲取配置
@Override
protected void setup(Mapper.Context context) throws IOException,InterruptedException {
Configuration config = context.getConfiguration();
table = new HTable(config,<Table Name>);
}
然后在地圖內部,從行參數中提取行鍵,創建新的“掃描”並按照上述說明繼續
在大多數情況下,下一條記錄將在同一地區-有時可能會轉到其他地區服務器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.