随时更新
一,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();
}
}