• hbase实验



     //石家庄铁道大学,软件工程系:沧月88

    实验环境:

    1、 操作系统:Linux(建议Ubuntu16.04);

    2、 Hadoop版本:2.7.1;

    3、 JDK版本:1.7或以上版本; 4、 Java IDE:Eclipse。

    实验目的:

    1、 理解HBase在Hadoop体系结构中的角色;

    2、 熟练使用HBase操作常用的Shell命令;

    3、 熟悉HBase操作常用的Java API。

    实验步骤:

    (一)编程实现以下指定功能,并用 Hadoop 提供的 HBase Shell 命令完成相同任务:

    (1) 列出 HBase 所有的表的相关信息,例如表名;

    list
    

    (2) 在终端打印出指定的表的所有记录数据;

    scan '表名'
    

    (3) 向已经创建好的表添加和删除指定的列族或列;

    alter '表名',NAME=>'列名'
    

     

    alter '表名',NAME=>'列名',METHOD=>'delete'
    

     

    (4) 清空指定的表的所有记录数据;

    truncate '表名'
    

     

    (5) 统计表的行数。

    count '表名'
    

     

    (二)HBase 数据库操作

    1. 现有以下关系型数据库中的表和数据,要求将其转换为适合于 HBase 存储的表并插入数 据:

    学生表(Student)

    学号(S_No)

    姓名(S_Name)

    性别(S_Sex)

    年龄(S_Age)

    2015001

    Zhangsan

    male

    23

    2015003

    Mary

    female

    22

    2015003

    Lisi

    male

    24

    课程表(Course)

    课程号(C_No)

    课程名(C_Name)

    学分(C_Credit)

    123001

    Math

    2.0

    123002

    Computer Science

    5.0

    123003

    English

    3.0

    选课表(SC)

    学号(SC_Sno)

    课程号(SC_Cno)

    成绩(SC_Score)

    2015001

    123001

    86

    2015001

    123003

    69

    2015002

    123002

    77

    2015002

    123003

    99

    2015003

    123001

    98

    2015003

    123002

    95

     创建表格思路:

    (1)关系型数据库转成非关系型数据库:本人的思路是:把关系型数据库的一个主键设置为行键,其他主键设置为一个列名。和行键一个表的其他数据单独成列。

    (2)具体分割如下:把学号作为行键,课程号作为列名,student表的其他数据成列。

    代码如下:(自己封装了一个jar包)

    Hbase_gao.createTable("SC",new String[]{"name","sex","age","123001","123002","123003"});
    	       Hbase_gao.insertRow("SC", "2015001",  "name","", "Zhangsan");
    	       Hbase_gao.insertRow("SC", "2015001",  "sex","",  "male");
    	       Hbase_gao.insertRow("SC", "2015001",  "age", "", "23");
    	       Hbase_gao.insertRow("SC", "2015001", "123001", "cname", "Math");
    	       Hbase_gao.insertRow("SC", "2015001", "123001", "credit", "2.0");
    	       Hbase_gao.insertRow("SC", "2015001", "123001", "score", "86");
    	       Hbase_gao.insertRow("SC", "2015001", "123003", "cname", "English");
    	       Hbase_gao.insertRow("SC", "2015001", "123003", "credit", "3.0");
    	       Hbase_gao.insertRow("SC", "2015001", "123003", "score", "69");
    	       
    	       Hbase_gao.insertRow("SC", "2015002",  "name","", "Mary");
    	       Hbase_gao.insertRow("SC", "2015002",  "sex","",  "female");
    	       Hbase_gao.insertRow("SC", "2015002",  "age", "", "22");
    	       Hbase_gao.insertRow("SC", "2015002", "123002", "cname", "Computer Science");
    	       Hbase_gao.insertRow("SC", "2015002", "123002", "credit", "5.0");
    	       Hbase_gao.insertRow("SC", "2015002", "123002", "score", "77");
    	       Hbase_gao.insertRow("SC", "2015002", "123003", "cname", "English");
    	       Hbase_gao.insertRow("SC", "2015002", "123003", "credit", "3.0");
    	       Hbase_gao.insertRow("SC", "2015002", "123003", "score", "99");
    	       
    	       Hbase_gao.insertRow("SC", "2015003",  "name","", "Lisi");
    	       Hbase_gao.insertRow("SC", "2015003",  "sex","",  "male");
    	       Hbase_gao.insertRow("SC", "2015003",  "age", "", "24");
    	       Hbase_gao.insertRow("SC", "2015003", "123001", "cname", "Math");
    	       Hbase_gao.insertRow("SC", "2015003", "123001", "credit", "2.0");
    	       Hbase_gao.insertRow("SC", "2015003", "123001", "score", "98");
    	       Hbase_gao.insertRow("SC", "2015003", "123002", "cname", "Computer Science");
    	       Hbase_gao.insertRow("SC", "2015003", "123002", "credit", "5.0");
    	       Hbase_gao.insertRow("SC", "2015003", "123002", "score", "95");
    

    2.  请编程实现以下功能:

    链接语句:

        //建立连接
        public static void init(){
            configuration  = HBaseConfiguration.create();
            configuration.set("hbase.rootdir","hdfs://自己ip:9000/hbase");
            try{
                connection = ConnectionFactory.createConnection(configuration);
                admin = connection.getAdmin();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //关闭连接
        public static void close(){
            try{
                if(admin != null){
                    admin.close();
                }
                if(null != connection){
                    connection.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    

    (1)createTable(String tableName, String[] fields)

    创建表,参数 tableName 为表的名称,字符串数组 fields 为存储记录各个字段名称的数组。 要求当 HBase 已经存在名为 tableName 的表的时候,先删除原有的表,然后再创建新的表。

         * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
         * @param myTableName 表名
         * @param colFamily 列族名
         * @throws IOException
         */
        public static void createTable(String myTableName,String[] colFamily) throws IOException {
     
            init();
            TableName tableName = TableName.valueOf(myTableName);
     
            if(admin.tableExists(tableName)){
                System.out.println("talbe is exists!");
    admin.disableTable(tablename);
    admin.deleteTable(tablename);
            }
                HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
                for(String str:colFamily){
                    HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
                    hTableDescriptor.addFamily(hColumnDescriptor);
                admin.createTable(hTableDescriptor);
                System.out.println("create table success");
            }
            close();
        }
    

    (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 存储这三门课的成绩。

         * 向某一行的某一列插入数据
         * @param tableName 表名
         * @param rowKey 行键
         * @param colFamily 列族名
         * @param col 列名(如果其列族下没有子列,此参数可为空)
         * @param val 值
         * @throws IOException
         */
        public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
            init();
            Table table = connection.getTable(TableName.valueOf(tableName));
            Put put = new Put(rowKey.getBytes());
            put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
            table.put(put);
            table.close();
            close();
        }
    

    (3)scanColumn(String tableName, String column)

    浏览表 tableName 某一列的数据,如果某一行记录中该列数据不存在,则返回 null。要求 当参数 column 为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表 的列的数据;当参数 column 为某一列具体名称(例如“Score:Math”)时,只需要列出该列的 数据。

        /**
         * 根据行键rowkey查找数据
         * @param tableName 表名
         * @param rowKey 行键
         * @param colFamily 列族名
         * @param col 列名
         * @throws IOException
         */
        public static void getData(String tableName,String rowKey,String colFamily,String col)throws  IOException{
            init();
            Table table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(rowKey.getBytes());
            get.addColumn(colFamily.getBytes(),col.getBytes());
            Result result = table.get(get);
            showCell(result);
            table.close();
            close();
        }
    

    (4)modifyData(String tableName, String row, String column)

    修改表 tableName,行 row(可以用学生姓名 S_Name 表示),列 column 指定的单元格的 数据。

         * 向某一行的某一列插入数据
         * @param tableName 表名
         * @param rowKey 行键
         * @param column 列族名
         * @param val 值
         * @throws IOException
         */
        public static void modiyData(String tableName,String row,String column,String val) throws IOException {
            init();
            Table table = connection.getTable(TableName.valueOf(tableName));
            Put put = new Put(row.getBytes());
            put.addColumn(column.getBytes(), val.getBytes());
            table.put(put);
            table.close();
            close();
        }
    

    (5)deleteRow(String tableName, String row)

    删除表 tableName 中 row 指定的行的记录。

        /**
         * 删除数据
         * @param tableName 表名
         * @param row 行键
         * @throws IOException
         */
        public static void deleteRow(String tableName,String row) throws IOException {
            init();
            Table table = connection.getTable(TableName.valueOf(tableName));
            Delete delete = new Delete(row.getBytes());
            table.delete(delete);
            table.close();
            close();
        }
    
    https://necydcy.me/
  • 相关阅读:
    ArcGIS.Server.9.2.DotNet实现EditorTask功能扩展(自带例子 十、三)
    ArcGIS.Server.9.2.DotNet在地图中显示xml数据(自带例子 九、一)
    ArcGIS.Server.9.2.DotNet实现类似GoogleMap的操作工具条(ADF的Toolbar太丑)
    ArcGIS.Server.9.2.DotNet实现在线编辑EditorTask使用(自带例子 十、二)
    ArcGIS.Server.9.2.DotNet网络分析之最短路径分析
    ArcGIS.Server.9.2.DotNet实现点、线、面的缓冲分析Buffer
    ArcGIS.Server.9.2.DotNet在ElementGraphicsLayer画点、线、折线、面、圆、矩形的代码
    SQL Server Express和ArcSDE Personal Edition(自带例子 十、一)
    ArcGIS.Server.9.2.DotNet使用Virtual Earth地图图片数据(自带例子 九、二)
    IIS FTP 安装程序无法复制文件的问题
  • 原文地址:https://www.cnblogs.com/miria-486/p/9863153.html
Copyright © 2020-2023  润新知