hbase总结一

随时更新

一,RowKey设计

瘦表更加高效一点

 

 

 

二,Scan.addColumn(byte[] family, byte[] qualifier)方法

如果添加了两列

scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("p1"));
  scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("p2"));

则Scan的结果里只有p1和p2这两列。并且Filter只过滤p1和p2这两列。

 

三,FilterList fList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

添加到FilterList的Filter的执行顺序和添加顺序一致。

 

四,二级索引

用Coprocessor创建二级索引测试

当用户向p9表put一条数据时,Coprocessor会向phone表插入一条数据。类似于RDBMS中的触发器。

package com.myub;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.hbase.CoprocessorEnvironment;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.util.Bytes;

public class SecIndex extends BaseRegionObserver {
	private HTablePool pool = null;
	private final static String INDEX_TABLE = "phone";
	private final static String SOURCE_TABLE = "p9";
	
	@Override
	public void start(CoprocessorEnvironment env) throws IOException {
		pool = new HTablePool(env.getConfiguration(), 10);
	}
	
	@Override
	public void prePut(final ObserverContext<RegionCoprocessorEnvironment> observerContext,
		      final Put put,
		      final WALEdit edit,
		      final boolean writeToWAL) throws IOException {
		byte[] table = observerContext.getEnvironment().getRegion().getRegionInfo().getTableName();
		
		if (!Bytes.equals(table, Bytes.toBytes(SOURCE_TABLE))) return;
		
		try {
			final List<KeyValue> filteredList = put.get(Bytes.toBytes("cf"), Bytes.toBytes("p1"));				
			
			HTableInterface idxTable = pool.getTable(INDEX_TABLE);
			List<Put> puts = new ArrayList<Put>();
			for(KeyValue kv : filteredList) {								
				Put idxPut = new Put(kv.getValue());
				idxPut.add(Bytes.toBytes("cf"), Bytes.toBytes("ub"), kv.getRow());
				puts.add(idxPut);				
			}
			idxTable.put(puts);					
			idxTable.close();
		}
		catch(IllegalArgumentException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void stop(CoprocessorEnvironment env) throws IOException {
		pool.close();
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值