Hadoop HBase:使用与现有表相同的架构创建表

Hadoop HBase:使用与现有表相同的架构创建表,hadoop,hbase,mapr,hbase-shell,Hadoop,Hbase,Mapr,Hbase Shell,我尝试在论坛上搜索,在那里我可以从现有的hbase表模式创建一个新的空hbase表,但找不到 更准确地说,假设我有一个表,其中包含多个列族和多个列限定符 现在我必须用相同的模式创建另一个空表。我们是否可以像在RDBMS中那样创建表 Create table new_table as select * from existing_table where 1=2; 现有表具有复杂的结构,因此不能使用指定了列族和列限定符的常规hbasecreate table命令 仅供参考。。我正在使用Mapr H

我尝试在论坛上搜索,在那里我可以从现有的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
,我没有选择切换到任何高级版本或其他发行版。

您可以使用快照功能来完成此操作。像这样,

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

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

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

1) 在下面的命令下启动HBase外壳

 hbase shell
 hbase> describe ‘existing_table’;
2) 使用以下命令查询现有表元数据

 hbase shell
 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查询:

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'}

你就完了。新的表模式与现有表完全相同。

感谢您的响应,我只是想了解
禁用“tableName”
可以做什么。我没有使原始表脱机的选项(无法停止从其他程序读取/写入)。我只需要模式,对要复制的数据不感兴趣。我们可以使用快照功能创建一个新的架构副本吗?对不起,我编辑了我的答案。您不需要禁用table来运行snapshot命令。这可以通过阅读HBase手册的snapshot部分得到支持:这是一个有4年历史的问题,并显示了一种解决方法,即不提供确切的代码来执行他所要求的操作。如果答案有用,您是否可以接受我的答案。这将有助于使用现有架构创建新架构,我们将如何使用现有表和模式alsoUse快照功能复制数据以克隆hbase表。