我有一些hbase表,有数百万行,但只有几列。我想提取每个表的列名并将其存储在一个单独的文件中。最好的方法是什么?谢谢。
eqzww0vc1#
这将在中保存列名 Hbase_table_columns.txt 本地文件(不在hdfs上):
Hbase_table_columns.txt
echo "scan 'table_name'" | $HBASE_HOME/bin/hbase shell | awk -F'=' '{print $2}' | awk -F ':' '{print $1}' > Hbase_table_columns.txt
这将在控制台上保存列名:
echo "scan 'table_name'" | $HBASE_HOME/bin/hbase shell | awk -F'=' '{print $2}' | awk -F ':' '{print $1}'
这将在中保存列名 Hbase_table_columns.txt 文件并在控制台上打印:
echo "scan 'table_name'" | $HBASE_HOME/bin/hbase shell | awk -F'=' '{print $2}' | awk -F ':' '{print $1}' |tee Hbase_table_columns.txt
应该保存/打印 column family:column name :
column family:column name
echo "scan 'table_name'" | $HBASE_HOME/bin/hbase shell | awk -F'=' '{print $2}'|tee Hbase_table_columns.txt
unguejic2#
客户会说
package mytest; import com.usertest.*; import java.io.IOException; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; public class ListHbaseTablesAndColumns { public static void main(String[] args) { try { HbaseMetaData hbaseMetaData =new HbaseMetaData(); for(String hbaseTable:hbaseMetaData .getTableNames(".*yourtables.*")){ for (String column : hbaseMetaData .getColumns(hbaseTable, 10000)) { System.out.println(hbaseTable + "," + column); } } } catch (IOException e) { e.printStackTrace(); } } }
使用below类获取hbasemetadata。。
package com.usertest; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.PageFilter; import java.io.IOException; import java.util.*; import java.util.regex.Pattern; public class HbaseMetaData { private HBaseAdmin hBaseAdmin; private Configuration hBaseConfiguration; public HbaseMetaData () throws IOException { this.hBaseConfiguration = HBaseConfiguration.create(); this.hBaseAdmin = new HBaseAdmin(hBaseConfiguration); } /**get all Table names**/ public List<String> getTableNames(String regex) throws IOException { Pattern pattern=Pattern.compile(regex); List<String> tableList = new ArrayList<String>(); TableName[] tableNames=hBaseAdmin.listTableNames(); for (TableName tableName:tableNames){ if(pattern.matcher(tableName.toString()).find()){ tableList.add(tableName.toString()); } } return tableList; } /**Get all columns**/ public Set<String> getColumns(String hbaseTable) throws IOException { return getColumns(hbaseTable, 10000); } /**get all columns from the table**/ public Set<String> getColumns(String hbaseTable, int limitScan) throws IOException { Set<String> columnList = new TreeSet<String>(); HTable hTable=new HTable(hBaseConfiguration, hbaseTable); Scan scan=new Scan(); scan.setFilter(new PageFilter(limitScan)); ResultScanner results = hTable.getScanner(scan); for(Result result:results){ for(KeyValue keyValue:result.list()){ columnList.add( new String(keyValue.getFamily()) + ":" + new String(keyValue.getQualifier()) ); } } return columnList; } }
xvw2m8pv3#
下面将有助于获取有关特定键的列 scan 'namespace:tablename',{FILTER=>'KeyOnlyFilter()'}
scan 'namespace:tablename',{FILTER=>'KeyOnlyFilter()'}
3条答案
按热度按时间eqzww0vc1#
这将在中保存列名
Hbase_table_columns.txt
本地文件(不在hdfs上):这将在控制台上保存列名:
这将在中保存列名
Hbase_table_columns.txt
文件并在控制台上打印:应该保存/打印
column family:column name
:unguejic2#
我会提供由hbaseadmin类公开的JavaHBase客户端api,如下所示。。。
客户会说
使用below类获取hbasemetadata。。
xvw2m8pv3#
下面将有助于获取有关特定键的列
scan 'namespace:tablename',{FILTER=>'KeyOnlyFilter()'}