2011-12-08 6 views
0

私は012baseとHbaseのやり方、または私の問題を解決する他の種類のパターンをどうやって行うかを考えようとしています。私はこれを非常に簡単に行うMapReduceプログラムを書くことができましたが、データが既に必要な方法でソートされているという事実を利用することができればと思っています。次のようにHbaseのリードとラグ

私の問題は、次のとおりです。

(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 

は、私は何をしたいの計算である私はのrowKey等が見える価値を持っています給料の変化は、記録によって記録する。私はレコード間の差異に上記のデータを変換したい:

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 

私は、必要に応じてのrowKey戦略を変更するためのアップです。

+0

レコード差分でレコードを必要とする場合は、どうしたらいいですかそれを行うためにmap/reduce(実際には地図だけ)を書くのですか? –

+0

マップオンリージョブの問題は、同じ個人の2つの行キーが2つのマップタスクにまたがっている場合をどのように扱うかです。 –

+0

私は今これを行うmapreduceジョブを持っています。それがすでにソートされているときに、減速機にデータをシャッフルするだけで馬鹿に見えます。 –

答えて

1

私は何をしたいことは、タイムスタンプは、(最初​​の新しい給​​料)を下降されるようにキーを変更され

miller, bob;2011-12-03 => data:salary=107000 
miller, bob;2010-11-04 => data:salary=102000 
miller, bob;2010-01-14 => data:salary=90000 

今、あなたは、テーブルをスキャンする簡単なマップの仕事をすることができます。次に、マップで現在のキーに新しいスキャンを作成します。以前の給与を取得して差分を計算し、現在の行キーの新しい列に保存します
基本的に、マッパークラス(TableMapperを継承するクラス)では、設定メソッドをオーバーライドして設定を取得します。

@Override 
protected void setup(Mapper.Context context) throws IOException,InterruptedException { 
    Configuration config = context.getConfiguration(); 
    table = new HTable(config,<Table Name>); 
} 

は、マップ内には、行parmeterから行キーを抽出し、新しいスキャンを作成し、ほとんどの場合、次のレコードは、同じ地域にあるであろう

上で説明したよう継続 - 時折、それは別のものに行くかもしれませんregionserver

+0

ファンタスティック。私はJavaのmapreduceからhbaseを問い合わせることについて多くのことを知らないので、 'Scan.next'が私のためにこれを行うことができるとは気付かなかった。 –

+0

スキャンオブジェクトは、Hbaseに対して実際のクエリを実行する必要がないほどスマートになりますか? –

+0

おそらく - 私はそれをテストしていない –

関連する問題