package net.hbase.secondaryindex.mapred; import java.io.IOException; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; import net.hbase.secondaryindex.util.Const; public class IndexRowkeyMapper extends TableMapper<Writable, Writable> { private String column; private String rowkeyFields; private Text k = new Text(); private Text v = new Text(); @Override protected void setup(Context context) throws IOException, InterruptedException { column = context.getConfiguration().get(Const.HBASE_CONF_COLUMN_NAME); rowkeyFields = context.getConfiguration().get( Const.HBASE_CONF_ROWKEY_NAME); } @Override public void map(ImmutableBytesWritable row, Result columns, Context context) throws IOException { boolean valid = false; boolean hit = false; try { byte[] rowkey = row.get(); String cf = Const.COLUMN_FAMILY_CF1_STRING; String qualifier = null; // Get timestamp of validate column long ts = System.currentTimeMillis(); String[] arr = column.split(",", -1); if (arr.length == 2) { valid = true; for (String col : arr) { for (KeyValue kv : columns.list()) { String columnName = Bytes.toString(kv.getFamily()) + Const.FAMILY_COLUMN_SEPARATOR + Bytes.toString(kv.getQualifier()); if (!col.equals(Const.MAPPER_TYPE_ROWKEY) && columnName.equals(col)) { ts = kv.getTimestamp(); hit = true; break; } } } } // valid column timestamp value does not exist if (valid && !hit) return; String rowkeyStr = Bytes.toStringBinary(rowkey); String[] fieldArr = rowkeyFields.split(",", -1); int rorder = -1; for (String field : fieldArr) { if (field.indexOf(Const.PARAMETER_ISROWKEY) >= 0) { String[] farr = field.split(Const.FAMILY_COLUMN_SEPARATOR, -1); if (farr.length == 2) { rorder = Integer.parseInt(farr[1]) - 1; } } } int corder = -1; for (String field : fieldArr) { if (field.indexOf(Const.PARAMETER_ISROWKEY) < 0) { String[] farr = field.split(Const.FAMILY_COLUMN_SEPARATOR, -1); if (farr.length == 2) { corder = Integer.parseInt(farr[1]) - 1; if (corder != rorder) qualifier = farr[0]; } } } if (rorder < 0 || corder < 0) return; String[] rowkeyArr = rowkeyStr.split( Const.ROWKEY_DEFAULT_SEPARATOR, -1); if (rowkeyArr.length > rorder && rowkeyArr.length > corder) { k.set(rowkeyArr[rorder] + Const.FIELD_COMMON_SEPARATOR + ts); v.set(cf + Const.FIELD_COMMON_SEPARATOR + qualifier + Const.FIELD_COMMON_SEPARATOR + rowkeyArr[corder]); context.write(k, v); } } catch (Exception e) { e.printStackTrace(); System.err.println("Error: " + e.getMessage() + ", Row: " + Bytes.toString(row.get())); } } }