我可以告诉hbase使用以下方法禁用和删除特定的表:
disable 'tablename'
drop 'tablename'
但是我想删除数据库中的所有表而不用硬编码任何表的名称。有没有办法做到这一点?我想通过命令行实用程序./hbase shell
执行此操作,而不是通过Java或Thrift执行此操作。
答案 0 :(得分:20)
disable_all和drop_all已添加为HBase ruby shell中的命令。这些命令是在jira HBASE-3506中添加的。这些命令使用表的正则表达式来禁用/删除。他们会在继续之前要求确认。这应该会使很多表格变得非常容易,并且不需要外部库或脚本。
答案 1 :(得分:10)
我有一个方便的脚本,使用Python Happybase库完成此操作:
import happybase
c = happybase.Connection()
for table in c.tables():
c.disable_table(table)
c.delete_table(table)
print "Deleted: " + table
您需要安装Happybase才能使用此脚本,您可以将其安装为:
sudo easy_install happybase
答案 2 :(得分:6)
您可以将命令传递给bin/hbase shell
命令。从那里,您可以使用一些脚本来获取表名,并将禁用/删除命令传递回hbase。
即
echo "list" | bin/hbase shell | ./filter_table_names.pl > table_names.txt
./turn_table_names_into_disable_delete_commands.pl table_names.txt | bin/hbase shell
答案 3 :(得分:1)
有一个黑客。 打开$ HBASE_HOME / lib / ruby / shell / commands / list.rb文件,并在命令方法的底部添加以下行。
return list
之后,list命令返回所有表的名称数组。 然后就这样做。
list.each {|t| disable t;drop t}
答案 4 :(得分:0)
我不是通过hbase shell删除表,而是从命令行删除它们,
- 删除我的hadoop分布式文件系统目录,然后,
- 创建一个新的干净的hadoop分布式文件系统目录,然后,
- 用'hadoop namenode -format'格式化我的hadoop分布式文件系统,然后,
- start-all.sh和start-hbase.sh
参考:
http://hadoop.apache.org/common/docs/r0.20.1/api/overview-summary.html#overview_description
答案 5 :(得分:0)
如果您正在寻找通过shell脚本在'one-liner'中执行此操作的内容,则可以使用此方法:
$ echo 'list.each {|t| disable t; drop t}; quit;' | hbase shell
注意:以上是从Bash shell提示符运行的。它将命令回显到hbase shell
并循环遍历从list
命令返回的所有表,然后禁用&删除每个表,因为它遍历list
返回的数组。一旦完成,它就会退出。