HBase:通过JavaAPI截断表启用被截断的表

HBase:通过JavaAPI截断表启用被截断的表,java,hadoop,hbase,Java,Hadoop,Hbase,我在使用Java API截断HBase表时遇到了意外行为。具体而言,我正在执行以下操作: 禁用该表 截断表格 启用该表 与这些操作相对应的代码如下: Configuration conf = HBaseConfiguration.create(); // ... // Setting properly the configuration information // ... try (HBaseAdmin admin = new HBaseAdmin(conf)) { if

我在使用Java API截断HBase表时遇到了意外行为。具体而言,我正在执行以下操作:

  • 禁用该表
  • 截断表格
  • 启用该表
  • 与这些操作相对应的代码如下:

     Configuration conf = HBaseConfiguration.create();
     // ...
     // Setting properly the configuration information
     // ...
     try (HBaseAdmin admin = new HBaseAdmin(conf)) {
         if (admin.isTableEnabled(TABLE_NAME)) {
             admin.disableTable(TABLE_NAME);
         }
         admin.truncateTable(TableName.valueOf(TABLE_NAME), false);
         // Enabling the table after having truncated
         admin.enableTable(TABLE_NAME);
     } catch (MasterNotRunningException e) {
         e.printStackTrace();
     } catch (ZooKeeperConnectionException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
    
    现在,truncate操作后的语句
    admin.enableTable(TABLE_NAME)
    抛出一个
    org.apache.hadoop.hbase.TableNotDisabledException
    。对吗?通过JavaAPI截断一个表会自动重新启用它吗

    我已经检查了API,没有找到任何关于此行为的参考


    我正在使用HBase,版本1.0.0-cdh5.5.0。

    HBase truncate需要执行3个操作:

  • 如果表已经出现,则禁用该表(因为它在第二个操作中删除表,需要先禁用该操作)
  • 如果表已出现,则删除该表
  • 重新创建提到的表(任何创建操作都将自动启用该表)
  • hbase shell truncate命令也具有相同的行为。shell和java api之间唯一的区别是shell自动执行所有操作,但在java api中,需要先显式禁用表以实现第二个drop操作,最后一个操作再次创建它,因此默认情况下启用新表

    希望这能解释