我正在研究hbase java客户端,我能够从hbase数据存储中获取元数据,如所有表名,列族和列,但我无法获取hbase列的数据类型在谷歌上搜索并了解到无法获得数据类型
在hbase java客户端HTableDescriptor
,HColumnDescriptor
另一个问题是我正在以这种方式获取元数据我认为如果任何人都可以优化此代码的方式不是真正帮助我的方式
public List<ColumnFamily> getMetaDataOfTable(String tableName) {
HTable table = null;
try {
HTableDescriptor tableDescriptor = admin.getTableDescriptor(Bytes
.toBytes(tableName));
HColumnDescriptor[] columnDescriptor = tableDescriptor
.getColumnFamilies();
for (HColumnDescriptor temp : columnDescriptor) {
ColumnFamily columnFamily = new ColumnFamily();
columnFamily.setName(temp.getNameAsString());
columnFamilies.add(columnFamily);
}
table = new HTable(conf, tableName);
Scan scan = new Scan();
for (ColumnFamily columnFamily : columnFamilies) {
scan.addFamily(Bytes.toBytes(columnFamily.getName()));
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner
.next()) {
Map<byte[], byte[]> map = result.getFamilyMap(Bytes
.toBytes(columnFamily.getName()));
columnFamily.setColumnsList(getColumns(map));
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
table.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return columnFamilies;
}
如果可以,请帮助我 感谢
答案 0 :(得分:3)
使用HBase
时,您只能使用列族,而且不能使用类型。至少在我使用的版本0.98之前。
无论如何,列族应该用于对列进行分组,以便每组列用于其他内容,但不限制使用。
建议的最大列族数为3。
现在,回到你的问题,目前没有机制来定义HBase
内的列,只有家庭和内部族,你可以动态地设置列的值。
HBase
中的一行基本上是一组单元格,每个单元格都由列名称标识。
数据以二进制形式存储,您需要具有数据的编解码器。 Bytes.toXXX
方法可用于编码/解码数据。
HBase book是一个很好的参考,您也可以先查看datamodel,并清楚地了解结构。
答案 1 :(得分:3)
如果要使用HBase指定列类型,Apache Phoenix(SQL层/驱动器到HBase)可以实现这一点: