2012-03-06 4 views
3

私はHbaseの原子インクリメント列をPigに読み込み、Long値としてアクセスしようとしています。Pig + Hbase原子インクリメント列の値

ただし、列の値は、構造体のようなHbases六角を使用しています:\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X01

誰にequivilantになるために豚にそれを変換する方法を知っていますget_counter値:1

私は、UDFを使用して解決策を掲載している:

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.backend.executionengine.ExecException; 
import org.apache.pig.data.DataByteArray; 
import org.apache.pig.data.DataType; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.impl.logicalLayer.schema.Schema; 


public class ConvertToLong extends EvalFunc<Long> { 

@Override 
public Long exec(Tuple input) throws IOException { 

    if (input == null || input.size() == 0) { 
     return null; 
    } 

    try { 

     long value = 0; 
     DataByteArray dba = (DataByteArray)input.get(0); 
     System.out.println(dba.toString()); 
     byte[] ba = dba.get(); 

     for (int i = 0; i < ba.length; i++) 
     { 
      value = (value << 8) + (ba[i] & 0xff); 
     } 
     return value; 
     //return value; 
    } catch (ExecException e) { 
     log.warn("Error reading input: " + e.getMessage()); 
     return 3L; 
    } catch(Exception e){ 
     log.warn("Error:" + e.getMessage()); 
     return 2L; 
    } 
} 

@Override 
public Schema outputSchema(Schema input) { 
    return new Schema(new Schema.FieldSchema(null, DataType.LONG)); 
} 
} 
+0

でもキャスター= HBaseBinaryConverterせずに、あなたが長いとしてバイト配列を解釈するために使用シンプルなコードを持つことができます::PIG内のすべてのカウンタを一覧表示するには Bytes.toLong(BA)を返しますが、 –

答えて

7

HBaseから長整数をロードするためにUDFは必要ありません。 HBaseStorageの-caster=HBaseBinaryConverterオプションを利用できます。

例: 私はカウンタという名前のテーブルを持っています。値はval:valカラムの下に格納されます(データを8バイト長で格納するインクリメント機能を使用)。

counters = LOAD 'hbase://counters' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('val:val', '-caster=HBaseBinaryConverter -loadKey') AS (key:chararray, val:long); 
DUMP counters 
+0

Wow!これはどこかで文書化されていますか?確かに便利な機能です。ありがとう!また、同じコマンドでカウンタ値を保存できますか? –

+0

文書化されていないようですが、私はメーリングリストでこれを見つけました。私はそれが格納に使用できるかどうかわかりません。 –

+0

それは保存のために働きます。私は単純な例を試してみて、それを元に戻します。 –

0

私は、私はわかりませんが、あなたは以下のアプローチを試すことができHBaseStorageを使用したことがない:

は長いとしてそれを読んで試してみてください。

data = LOAD 'your/path' USING HBaseStorage(...) AS (x:long); 

問題が解決しない場合は、これを試してみてください。

data = LOAD 'your/path' USING HBaseStorage(...) 
data = FOREACH data GENERATE (long) $1 AS x; 

そうでない場合、あなたは常に変換を行うだろうUDFを書き込むことができます。

data = LOAD 'your/path' USING HBaseStorage(...); 
data = FOREACH data GENERATE ConvertToLong($1) as x; 
+0

第1および第2の方法はどちらもPigのヌル値にキャストします。それを達成できるUDFを作成しようとしますが、以前はPig UDFを使ったことはありませんでした。 –

+0

質問を更新して、UDFを使用したソリューションを含める –

関連する問題