我遇到了使用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();
}
现在,截断操作后的语句admin.enableTable(TABLE_NAME)
会抛出org.apache.hadoop.hbase.TableNotDisabledException
。这是对的吗?通过Java API截断表会自动重新启用它吗?
我检查了API,但没有找到任何对此行为的引用。
我正在使用HBase,版本1.0.0-cdh5.5.0。
答案 0 :(得分:2)
Hbase truncate需要执行3次操作:
与hbase-shell truncate命令相同。 shell和java api之间的唯一区别是shell自动执行all,但是在java api中,需要首先显式禁用表以实现第二次删除操作,最后一次操作再次创建它,因此默认情况下启用新表。
希望这能解释......