2016-05-25 13 views
0

HBaseの複数のテーブルに出力を書き込むことはできますか?私は別のブログ記事を見ましたが、道を見つけることができませんでした。たとえMultiTableOutputFormatを使っていました。 REDUCERから複数のテーブルに出力を書き込む

私はこれを参照: Write to multiple tables in HBASE

しかしcontext.writeコールのためにAPI署名を把握することはできませんが。

減速コード:

public class MyReducer extends TableReducer<Text, Result, Put> { 

    private static final Logger logger = Logger.getLogger(MyReducer.class); 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void reduce(Text key, Iterable<Result> data, Context context) throws IOException, InterruptedException { 
     logger.info("Working on ---> " + key.toString()); 
     for (Result res : data) { 
      Put put = new Put(res.getRow()); 
      KeyValue[] raw = res.raw(); 
      for (KeyValue kv : raw) { 
       put.add(kv); 
      } 

      context.write(obj, put); 
      **// I dont know how to give table name here.** 

     } 
    } 
} 

答えて

1

テーブル名を識別するために、あなたはcontext.write(key, put)方法をキーとしてテーブル名を渡す必要があります。

ImmutableBytesWritable key = new ImmutableBytesWritable(Bytes.toBytes("tableName")); 
context.write(key, put); 

をしかし、あなたは大量のデータをロードする場合MapReduceジョブを介してすぐにMultiTableHFileOutputFormatを使用するのが面白いかもしれません。

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/multiTableJobResult hbaseTable 

あなたが記事にMultiTableHFileOutputFormat詳細を読むことができます::http://tech.adroll.com/blog/data/2014/07/15/multi-table-bulk-import.html

+1

はいその通りです(+この出力形式は、必要なすべてのHBaseのテーブルのためのHFilesを作成し、簡単にLoadIncrementalHFilesツールでこれらのファイルを読み込むことができます1)上記の方法でキーとしてテーブルを渡す必要があります。あなたがマッパを使って書いているなら、以下に言及されている通りです。 // rowKeyは、lineBytesから生成されたhbaseのrowKeyです。 \t \t Put put = new Put(rowKey); \t \t // KeyValueオブジェクトを作成する \t \t put.add(kv); \t \t context.write( "actions"、put); //アクションテーブルに書き込む –

関連する問題