1、createTable(String tableName, String[] fields)
创建表,参数 tableName 为表的名称,字符串数组 fields 为存储记录各个字段名称的数组。要求当 HBase已经存在名为 tableName 的表的时候,先删除原有的表,然后再创建新的表
①当前存在的表
②代码:
public static void createTable(String tableName, String[] fields) throws IOException {
//取得与hbase集群连接方法
try {
init();
} catch (URISyntaxException e) {
e.printStackTrace();
}
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
TableName tabledn = TableName.valueOf(tableName);
//定义表
HTableDescriptor hTableDescriptor = new HTableDescriptor(tabledn);
for (String str : fields) {
//先定义列族,再创建表,即fields[]
HColumnDescriptor cfdn = new HColumnDescriptor(str);
hTableDescriptor.addFamily(cfdn);
}
//执行判断表是否存在
if (admin.tableExists(hTableDescriptor.getTableName())) {
System.out.println("该表存在,请先删除!");
//若存在先停用表再删除
admin.disableTable(hTableDescriptor.getTableName());
admin.deleteTable(hTableDescriptor.getTableName());
}
admin.createTable(hTableDescriptor);
System.out.println("创建成功");
admin.close();
connection.close();
}
//执行定义的方法
public static void main(String[] args) throws IOException {
createTable("tabledn",new String[]{"Score"});
}
执行成功结果:
hbase shell查看表:
存在表后再次执行结果:
hbase shell查看表结构:
2、addRecord(String tableName,String row, String[] fields, String[] values)
向表 tableName、行 row(用 S_Name 表示)和字符串数组 fields 指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”、“Computer Science”、 “English”三列添加成绩时,字符串数组 fields 为{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values 存储这三门课的成绩。
①hbase shell查看表当前内容:
②代码:
public static void addRecord(String tableName, String row, String[] fields, String[] values) throws IOException {
try {
init();
} catch (URISyntaxException e) {
e.printStackTrace();
}
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
TableName tabledn = TableName.valueOf(tableName);
Table table=connection.getTable(tabledn);
//添加内容操作
//fields存放column的内容,在分号左边为列族,右边为列
for (int i = 0; i < fields.length; i++) {
Put put = new Put(row.getBytes());
//以冒号进行分割fields里的数据,例如["Score","Math"]
String[] cols = fields[i].split(":");
if (cols.length == 1) {
put.addColumn(cols[0].getBytes(), "".getBytes(), values[i].getBytes());
//因为当输入的是单列族,split仅读出一个字符字符串,即cols仅有一个元素,对应获取values值
} else {
put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());
}
table.put(put);
}
System.out.println("添加数据成功");
table.close();
admin.close();
connection.close();
}
public static void main(String[] args) throws IOException {
//调用方法测试数据
addRecord("tabledn","row1",
new String[]{"Score:Math","Score:Computer Science","Score:English"},
new String[]{"60","70","90"});
}
执行成功结果:
hbase shell查看表内容:
3、scanColumn(String tableName, String column)
浏览表 tableName 某一列的数据,如果某一行记录中该列数据不存在,则返回 null。
要求当参数 column 为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数 column 为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。
①hbase shell当前数据:
②代码:
public static void scanColumn(String tableName, String column) throws IOException {
try {
init();
} catch (URISyntaxException e) {
e.printStackTrace();
}
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
TableName tabledn = TableName.valueOf(tableName);
Table table = connection.getTable(tabledn);
Scan scan = new Scan();
//将column内容用冒号进行分割,如若长度为1,即只有列族无列,直接获取列族,否则取整个column里的值
String[] cols = column.split(":");
if (cols.length == 1) {
scan.addFamily(Bytes.toBytes(column));
} else {
scan.addColumn(Bytes.toBytes(cols[0]), Bytes.toBytes(cols[1]));
}
//定义扫描器,对数据进行扫描
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next()) {
showCell(result);
}
table.close();
admin.close();
connection.close();
}
public static void showCell(Result result) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
System.out.println("RowName(行键):" + new String(CellUtil.cloneRow(cell)) + " ");
System.out.println("Timetamp(时间戳):" + cell.getTimestamp() + " ");
System.out.println("column Family(列簇):" + new String(CellUtil.cloneFamily(cell)) + " ");
System.out.println("column Name(列名):" + new String(CellUtil.cloneQualifier(cell)) + " ");
System.out.println("value:(值)" + new String(CellUtil.cloneValue(cell)) + " ");
System.out.println();
}
}
public static void main(String[] args) throws IOException {
//列数据不存在情况
scanColumn("tabledn", "Score:Chinese");
System.out.println("------------------------------------------------");
//扫描列族的情况
scanColumn("tabledn", "Score");
System.out.println("------------------------------------------------");
//扫描具体列的情况
scanColumn("tabledn", "Score:Math");
}
执行成功结果:
4、modifyData(String tableName, String row, String column)
修改表 tableName,行 row(可以用学生姓名 S_Name 表示),列 column 指定的单元格的数据。将"person"表 "Score:“Math"值修改为"100”。
①查看当前表的数据:
②代码:
public static void modifyData(String tableName, String row, String column, String value) throws IOException {
try {
init();
} catch (URISyntaxException e) {
e.printStackTrace();
}
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
//获取需要修改表内容的表名
TableName tabledn = TableName.valueOf(tableName);
Table table = connection.getTable(tabledn);
//没有特定的修改操作,是用添加数据来直接更改的,只要列簇名列名是一样的,可以直接修改values
Put put = new Put(row.getBytes());
String[] cols = column.split(":");
if (cols.length == 1) {
put.addColumn(column.getBytes(), "".getBytes(), value.getBytes());//qualifier:列族下的列名
} else {
put.addColumn(cols[0].getBytes(), cols[1].getBytes(), value.getBytes());//qualifier:列族下的列名
}
table.put(put);
table.close();
admin.close();
connection.close();
}
public static void main(String[] args) throws IOException {
modifyData("tabledn", "row1", "Score:Math", "100");
}
执行成功结果:
hbase shell查看修改后的数据:
5、deleteRow(String tableName, String row)删除表tableName 中row指定的行的记录
,tableName=Score,row=s002,columnFamily=Score,column=math。
①在表中添加一行s002测试数据:
②代码:
public static void deleteRow(String tableName, String row) throws IOException {
try {
init();
} catch (URISyntaxException e) {
e.printStackTrace();
}
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
//定义表名
// TableName tabledn = TableName.valueOf("tabledn");
//获取需要删除表内容的表名
TableName tabledn = TableName.valueOf(tableName);
Table table = connection.getTable(tabledn);
Delete delete = new Delete(row.getBytes());
table.delete(delete);
System.out.println("删除成功");
table.close();
admin.close();
connection.close();
}
public static void main(String[] args) throws IOException {
deleteRow("tabledn", "s002");
}
执行成功结果:
hbase shell查看删除结果: