HBase:创建与现有表具有相同架构的表



我尝试在论坛上搜索,在那里我可以从现有的 hbase 表模式创建一个新的空 hbase 表,但找不到。

更准确地说,假设我有一个表,其中包含多个列系列和这些系列中的许多列限定符。

现在,我必须创建另一个具有相同架构的空表。我们有什么办法像在RDBMS中那样创建表吗?

Create table new_table as
select * from existing_table where 1=2;

现有表具有复杂的结构,因此不能选择指定列系列和列限定符的普通 hbase create table命令。

仅供参考。我正在使用Mapr HBase 0.98.12-mapr-1506,但我无法选择切换到任何高级版本或其他发行版。

这是我使用的完全证明方法。希望它能帮助其他人。

1) 以下命令启动 HBase 外壳小瓶

 hbase shell

2)使用以下命令查询现有表元数据

 hbase> describe ‘existing_table’;

输出将类似于:

{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING 
=> 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION
_SCOPE => '0'}                                                                                                                  
{NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING 
=> 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION
_SCOPE => '0'}

3) 将此输出复制到记事本并执行以下更改:

  a) Replace  TTL => 'FOREVER' with TTL => org.apache.hadoop.hbase.HConstants::FOREVER
  b) Put an additional comma (,) between each column family description to connect column family definition.
  c) Remove newline characters (n, r) for the text; such that the content become one line text.

4) 最后使用新表名运行创建查询:

create ‘copy_of_exsting_table_schema’, {NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING 
=> 'NONE', TTL => org.apache.hadoop.hbase.HConstants::FOREVER, COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION
_SCOPE => '0'} ,{NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING 
=> 'NONE', TTL => org.apache.hadoop.hbase.HConstants::FOREVER, COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION
_SCOPE => '0'}

你完成了。新表架构与现有表完全相同。

您可以使用

快照功能来执行此操作。 像这样;

hbase> snapshot 'tableName', 'tableSnapshot'
hbase> clone_snapshot 'tableSnapshot', 'newTableName'
hbase> delete_snapshot 'tableSnapshot'
hbase> truncate 'newTableName'

我希望你的桌子不是很大。而且你不能复制带有空值的列限定符,如果我没有理解错,你的意思是在你的问题中。您可以将所有数据复制到新表,也可以仅将具有列族、协处理器的表结构复制到新表。等。

最新更新