尝试截断这样的表
list.each{|name| truncate(name) if name.end_with?('abc123')}
不起作用。如何处理这个?
答案 0 :(得分:3)
在HBase shell
中你也可以这样做:
java_import org.apache.hadoop.hbase.client.HBaseAdmin
java_import org.apache.hadoop.hbase.HBaseConfiguration
admin = HBaseAdmin.new(HBaseConfiguration.create)
admin.listTables.each {|i| t=i.getNameAsString; truncate(t) if t.end_with?('abc123')}
答案 1 :(得分:2)
您可以使用Python的Happybase和下面的脚本来执行此操作(您还需要启用与HBase的Thrift连接):
import happybase
# String that the table name ends with
string = "abc123"
# Connect to HBase
c = happybase.Connection()
# For each table
for t in c.tables():
# If the table ends with this string
if t.endswith(string):
# Disable and delete the table
c.disable_table(t)
c.delete_table(t)
# Recreate it
# Make sure to edit the below line with your own column-family structure
c.create_table(t, {'cf':{}})
# Print the name of the table
print (t + " truncated")
答案 2 :(得分:1)
为了补充Suman从上面得到的答案,这是我自己使用thrift的ruby rake任务。
# coding: utf-8
namespace :truncate do
desc 'batch truncate tables'
task :tables => :environment do
require 'thrift'
socket = ::Thrift::Socket.new(Constants.hbase_url, Constants.hbase_port, 5)
transport = ::Thrift::BufferedTransport.new(socket)
transport.open
protocol = ::Thrift::BinaryProtocol.new(transport)
hbase_conn = Apache::Hadoop::Hbase::Thrift::Hbase::Client.new(protocol)
# define some columns
col1 = Apache::Hadoop::Hbase::Thrift::ColumnDescriptor.new(:name => 'cf1', :maxVersions => 1, :inMemory => true)
col2 = Apache::Hadoop::Hbase::Thrift::ColumnDescriptor.new(:name => 'cf2', :maxVersions => 1, :inMemory => true)
hbase_conn.getTableNames.each do |table_name|
if table_name.end_with?('abc123')
hbase_conn.disableTable(table_name)
hbase_conn.deleteTable(table_name)
hbase_conn.createTable(table_name,[col1,col2])
puts "truncated #{table_name}"
end
end
end
end
答案 3 :(得分:1)
我通常只使用我开发的Bash单线程来迭代所有HBase表,然后逐个截断它们。
$ for i in $(hbase shell <<<list |& sed -e '/row(s)/,$d;1,/TABLE/d;/SLF4J:/d'); do \
hbase shell <<<"truncate '$i'"; done
for循环遍历此命令生成的所有输出:
hbase shell <<<list |& sed -e '/row(s)/,$d;1,/TABLE/d;/SLF4J:/d'
这将获取hbase shell list
命令的输出,然后将其解析,以便它只是表名。然后,for循环只需多次调用hbase shell <<<"truncate '..tablename..'"
。
在HBase的shell中,您可以完全访问Ruby,因此您可以这样做。
$ echo 'list.each {|t| truncate t}; quit;' | hbase shell
答案 4 :(得分:1)
如果您在hbase shell
,那么您可以向truncate
所有表数据发出以下命令
list.each {|tableName| truncate tableName}