大数据实验任务二
题目:创建一个学生信息表student,用来存储学生姓名(姓名作为行健,并且假设姓名不会重复)以及考试成绩,其中,考试成绩是一个列族,分别存储了各个科目的考试成绩。然后,向表student中添加数据。
一、搭建环境
1. HBase的配置参考
2. 需要提前配置好pom.xml和log4j。不确定的可以参考实验一
3.配置hbase-site.xml
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node0,node1,node2,node3</value>
</property>
</configuration>
二、 编写程序
新建一个createTabale程序
package org.hqp.task.task2;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class createTable {
public static Connection connection = null;
public static Admin admin = null;
/**
* 静态代码块,伴随jvm的运行加载,创建Connection并且得到管理DDL的Admin
*/
static {
try {
// 从ConnectionFactory中得到一个connection实例
connection = ConnectionFactory.createConnection();
} catch (IOException e) {
System.out.println("Connection Failed!");
}
try {
// 通过connection得到管理命名空间与数据表级别的admin实例
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建命名空间用以存放数据表
*
* @param namespace
*/
public static void createNameSpace(String namespace) {
try {
// 调用admin实例来创建一个命名空间
admin.createNamespace(NamespaceDescriptor.create(namespace).build());
} catch (IOException e) {
System.out.println("Namespace Has Existed!");
}
}
/**
* 创建数据表
*
* @param namespace
* @param tableName
* @param columFamilies
*/
public static void createTable(String namespace, String tableName, String... columFamilies) {
createNameSpace(namespace);
// 创建一个表的建造器
TableDescriptorBuilder tableBuilder = TableDescriptorBuilder
.newBuilder(TableName.valueOf(namespace, tableName));
// 构造所有的列并且注入表的建造器中
for (String columnFamily : columFamilies) {
ColumnFamilyDescriptorBuilder familyBuilder = ColumnFamilyDescriptorBuilder
.newBuilder(Bytes.toBytes(columnFamily))
.setMaxVersions(1);
tableBuilder.setColumnFamily(familyBuilder.build());
}
try {
// 调用admin实例创建表
admin.createTable(tableBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 格式化参数列表
*
* @param args
* @throws IOException
*/
public static void handle(String[] args) throws IOException {
String namespace = args[0];
String tableName = args[1];
String rowKey = args[2];
String columnFamily = args[3];
int nums = Integer.valueOf(args[4]);
String[] columnNames = new String[nums];
String[] values = new String[nums];
try {
// 得到键值对
for (int i = 0; i < nums; i++) {
// 得到键(key)
columnNames[i] = args[i * 2 + 5];
// 得到值(value)
values[i] = args[i * 2 + 6];
}
} catch (IndexOutOfBoundsException e) {
System.out.println("key-value nums error!");
}
add(namespace, tableName, rowKey, columnFamily, columnNames, values);
}
/**
* 向数据表追加数据
*
* @param namespace
* @param tableName
* @param rowKey
* @param columnFamily
* @param columnName
* @param value
* @throws IOException
*/
public static void add(String namespace, String tableName, String rowKey, String columnFamily, String columnName[], String value[]) throws IOException {
// 得到指定的表
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
// 得到插入的最小单元,根据行键(rowkey)获得列
Put put = new Put(Bytes.toBytes(rowKey));
// 向put中注入多个键值对
for (int i = 0; i < columnName.length; i++) {
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName[i]), Bytes.toBytes(value[i]));
}
try {
// 将put放入table中
table.put(put);
} catch (IOException e) {
System.out.println("dont konw");
}
// 关闭table的连接
table.close();
}
public static void closeConnection() throws IOException {
// 关闭admin的连接
if (admin != null) {
admin.close();
}
if (connection != null) {
connection.close();
}
}
/**
* @param args args[0] 命名空间
* args[1] 表名
* args[2] 行键
* args[3] 列族
* args[4] 键值对数量
* args[5 + i] 列名
* args[5 + i + 1] 列值
* @throws IOException
*/
public static void main(String[] args) throws IOException {
createTable(args[0], args[1], args[3]);
handle(args);
closeConnection();
}
}
三、启动程序
输入程序实参,运行程序即可
work student hqp score 3 chinese 86 math 92 english 83