大数据实验任务二

大数据实验任务二

题目:创建一个学生信息表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

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值