ApacheGora,在reducer中设置新表名的位置

cnh2zyt3  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(331)

我有一个应用程序,它基本上是apache gora的hbase mapreduce作业。我是一个非常简单的例子,我想复制一个hbase表数据到一个新表。在何处写入新表名。我已经阅读了本指南,但找不到放置新表名的位置。下面是代码片段,

/* Mappers are initialized with GoraMapper.initMapper() or 
   * GoraInputFormat.setInput()*/
  GoraMapper.initMapperJob(job, inStore, TextLong.class, LongWritable.class,
      LogAnalyticsMapper.class, true);

  /* Reducers are initialized with GoraReducer#initReducer().
   * If the output is not to be persisted via Gora, any reducer 
   * can be used instead. */
  GoraReducer.initReducerJob(job, outStore, LogAnalyticsReducer.class);

简单的mr工作对这个案子来说很容易。

kt06eoxx

kt06eoxx1#

我会把你引向教程,但我会在这里澄清:)
表名是在Map中定义的。检查表Map。也许你有个文件叫 gora-hbase-mapping.xml 定义Map的位置。应该是这样的:

<table name="Nameofatable">
...
<class name="blah.blah.EntityA" keyClass="java.lang.Long" table="Nameofatable">

在这里您可以配置表名(如果两者都找到,请使用相同的名称)。可以有几个 <table> 以及 <class> . 也许一个是你的输入,一个是你的输出。
之后,必须示例化输入/输出数据存储 inStore 以及 outStore . 教程有点混乱,创建 inStore 以及 outStore 去错地方了。你只需要做一些事情:

inStore = DataStoreFactory.getDataStore(String.class, EntityA.class, hadoopConf);
outStore = DataStoreFactory.getDataStore(Long.class, OtherEntity.class, hadoopConf);

“以另一种方式”解释:
您可以用 DataStoreFactory.getDatastore(key class, entity class, conf). 查询请求的实体类 gora-hbase-mapping.xml 为了 <class name="blah.blah.EntityA" .
在那里面 <class> 这是属性 table= . 这是您的表名:)
所以:用表名将实体定义为输入,用表名将实体定义为输出
编辑1:
如果实体类相同,但表名不同,我能想到的唯一解决方案就是创建两个类 Entity1 以及 Entity2 使用相同的模式 gora-hbase-mapping.xml 创建两个 <table> 以及 <class> . 然后将这些商店变成:

inStore = DataStoreFactory.getDataStore(String.class, Entity1.class, hadoopConf);
outStore = DataStoreFactory.getDataStore(String.class, Entity2.class, hadoopConf);

它不是很干净,但应该可以工作:
编辑2(不适用于此问题):
如果源表和目标表相同,那么initreducerjob有一个版本允许这种行为 GeneratorJob.java :

StorageUtils.initMapperJob(currentJob, fields, SelectorEntry.class, WebPage.class, GeneratorMapper.class, SelectorEntryPartitioner.class, true);
StorageUtils.initReducerJob(currentJob, GeneratorReducer.class);

相关问题