HBase添加Column Family

HBase创建表时需要制定column family才能创建成功,如果之后想添加column family呢,闭门造车尝试了一下三种方法,总算有一种是成功的。下面主要说一下成功的方法,纯属闭门造车的摸索,不见得是标准的方法。(假设我们现在已经创建了一张表,表中只存在一个column family,并存在一条数据,如下图)。


我们要添加的column family为cf2

翻了翻HBaseAdmin,也就modifyTable像是改表结构的方法,那么需要解决的就是两个参数tableName和HTableDescriptor了

public void modifyTable(final byte [] tableName, HTableDescriptor htd)

tableName好说,主要就是HTableDescriptor了,我尝试过一下,第一种是直接new HTableDescriptor(),让后调用addFamily,执行完后,cf2出现了,但是cf1的数据都没了。第二种就是从建好的table get一个HTableDescriptor,然后调用addFamily,增加cf2,运行一下,直接告诉你一个类似只读权限的错误,具体怎么表述的不记得了,感兴趣的话可以自己试一下。转了一圈,还是从HTableDescriptor的构造好上入手。发现了HTableDescriptor(final HTableDescriptor desc)的构造函数,源码上的注释描述此构造方法Makes a deep copy of the supplied descriptor.Can make a modifiable descriptor from an UnmodifyableHTableDescriptor.

使用此构造函数获得一个HTableDescriptor

HTableDescriptor descriptor =new HTableDescriptor(table.getTableDescriptor());

我们再向里面插入一条数据,结果如下,原来的数据还在




用shell操作HBase时,当对HBase表做出更改时,先要把表disable掉,使用java API同样

admin.disableTable(tableName);

更改后再enable

具体的代码如下

package com.cnblogs.ipolaris.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

public class FamilyTest {

	/**
	 * @param args
	 * @throws ZooKeeperConnectionException 
	 * @throws MasterNotRunningException 
	 */
	public static void main(String[] args) throws Exception {
		Configuration conf = HBaseConfiguration.create();
		String tableName="test";
		//配置自己HBase的环境,其实主要是ZOOKEEPER的一些参数
		conf.set(HConstants.ZOOKEEPER_QUORUM, "hadoop2,hadoop3,hadoop4,hadoop5");
		conf.set(HConstants.ZOOKEEPER_CLIENT_PORT, "2222");
		
		HBaseAdmin admin = new HBaseAdmin(conf);
		HTable table = new HTable(conf,tableName);
		
		HTableDescriptor descriptor = new HTableDescriptor(table.getTableDescriptor());
		descriptor.addFamily(new HColumnDescriptor(Bytes.toBytes("cf2")));
		admin.disableTable(tableName);
		admin.modifyTable(Bytes.toBytes(tableName), descriptor);
		admin.enableTable(tableName);
		Put put = new Put(Bytes.toBytes("row1"));
		put.add(Bytes.toBytes("cf2"), Bytes.toBytes("column"), Bytes.toBytes("2"));
		table.put(put);
		table.close();
		admin.close();

	}

}


你可能感兴趣的:(HBase)