当前位置:   article > 正文

实验三-HBase数据库操作

实验三-HBase数据库操作

 第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop

  1. ssh localhost
  2. cd /usr/local/hadoop
  3. ./sbin/start-dfs.sh

 输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功

第二步:切换目录至/usr/local/hbase;再启动HBase.

 

进入shell界面:

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

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

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

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

 

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

统计表的行数。

(二)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

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

 这里只需要导入hbase安装目录中的lib文件中的所有jar包。

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

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

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.hbase.*;
  3. import org.apache.hadoop.hbase.client.*;
  4. import java.io.IOException;
  5. public class ExampleForHbase{
  6. public static Configuration configuration;//
  7. public static Connection connection;//
  8. public static Admin admin;//
  9. public static void main(String[] args) throws IOException {
  10. //创建一个表,表名为Score,列族为sname,course
  11. createTable("Score",new String[]{"sname","course"});
  12. }
  13. //建立连接
  14. public static void init() {
  15. configuration = HBaseConfiguration.create();
  16. configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
  17. try
  18. {
  19. connection = ConnectionFactory.createConnection(configuration);//创建连接
  20. admin = connection.getAdmin();//表操作对象
  21. }
  22. catch (IOException e){
  23. e.printStackTrace();
  24. }
  25. }
  26. //关闭连接
  27. public static void close() {
  28. try
  29. {
  30. if(admin != null) {
  31. admin.close();
  32. }
  33. if(null != connection) {
  34. connection.close();
  35. }
  36. }
  37. catch (IOException e)
  38. {
  39. e.printStackTrace();
  40. }
  41. }
  42. /**
  43. * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
  44. * @param myTableName 表名
  45. * @param colFamily 列族名
  46. * @throws IOException
  47. */
  48. public static void createTable(String myTableName,String[] colFamily) throws IOException {
  49. init();//先调用
  50. TableName tableName = TableName.valueOf(myTableName);//表名化作TableName对象
  51. if(admin.tableExists(tableName))
  52. {
  53. System.out.println("表已经存在!");
  54. }
  55. else //如果不在
  56. {
  57. HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);//表描述对象
  58. for(String str:colFamily) //传了所有列
  59. {
  60. HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);//列描述对象
  61. hTableDescriptor.addFamily(hColumnDescriptor);//列描述添加到表描述
  62. }
  63. admin.createTable(hTableDescriptor);
  64. System.out.println("表创建成功!");
  65. }
  66. close();
  67. }
  68. }

        (2)addRecord(String tableName, String row, String[] fields, String[] values)

        向表tableName、行row和字符串数组fields指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”、“Computer Science”、“English”三列添加成绩时,字符串数组fields为{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values存储这三门课的成绩。

  1. package A;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.client.*;
  4. import org.apache.hadoop.hbase.*;
  5. import java.io.IOException;
  6. public class ExampleForHbase {
  7. public static Configuration configuration;
  8. public static Connection connection;
  9. public static Admin admin;
  10. public static void addRecord(String tableName, String row, String[] fields, String[] values) throws IOException {
  11. init();
  12. Table table = connection.getTable(TableName.valueOf(tableName));
  13. for (int i = 0; i != fields.length; i++) {
  14. Put put = new Put(row.getBytes());
  15. String[] cols = fields[i].split(":");
  16. put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());
  17. table.put(put);
  18. }
  19. System.out.println("数据已插入!");
  20. table.close();
  21. close();
  22. }
  23. public static void init() {
  24. configuration = HBaseConfiguration.create();
  25. configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");
  26. try {
  27. connection = ConnectionFactory.createConnection(configuration);
  28. admin = connection.getAdmin();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. public static void close() {
  34. try {
  35. if (admin != null) {
  36. admin.close();
  37. }
  38. if (null != connection) {
  39. connection.close();
  40. }
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. public static void main(String[] args) {
  46. String[] fields = {"course:Math", "course:Computer Science", "course:English"};
  47. String[] values = {"99", "80", "100"};
  48. try {
  49. addRecord("Score", "ss", fields, values);
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }

 

 

(3)scanColumn(String tableName, String column)

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

  1. package A;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.*;
  4. import org.apache.hadoop.hbase.client.*;
  5. import org.apache.hadoop.hbase.util.Bytes;
  6. import java.io.IOException;
  7. public class ExampleForHbase{
  8. public static Configuration configuration;
  9. public static Connection connection;
  10. public static Admin admin;
  11. //建立连接
  12. public static void init() {
  13. configuration = HBaseConfiguration.create();
  14. configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
  15. try
  16. {
  17. connection = ConnectionFactory.createConnection(configuration);
  18. admin = connection.getAdmin();
  19. }
  20. catch (IOException e){
  21. e.printStackTrace();
  22. }
  23. }
  24. //关闭连接
  25. public static void close() {
  26. try
  27. {
  28. if(admin != null) {
  29. admin.close();
  30. }
  31. if(null != connection) {
  32. connection.close();
  33. }
  34. }
  35. catch (IOException e)
  36. {
  37. e.printStackTrace();
  38. }
  39. }
  40. public static void scanColumn(String tableName, String column)throws IOException {
  41. init();
  42. Table table = connection.getTable(TableName.valueOf(tableName));
  43. //Get get = new Get(rowKey.getBytes());
  44. //get.addColumn(colFamily.getBytes(),col.getBytes());
  45. //Result result = table.get(get);
  46. Scan scan = new Scan();
  47. scan.addFamily(Bytes.toBytes(column));
  48. ResultScanner scanner = table.getScanner(scan);
  49. for (Result result = scanner.next(); result != null; result = scanner.next()) {
  50. showCell(result);
  51. }
  52. table.close();
  53. close();
  54. }
  55. /**
  56. * 格式化输出
  57. * @param result
  58. */
  59. public static void showCell(Result result) {
  60. Cell[] cells = result.rawCells();
  61. for(Cell cell:cells) {
  62. System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
  63. System.out.println("Timetamp:"+cell.getTimestamp()+" ");
  64. System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
  65. System.out.println("Column Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
  66. System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
  67. }
  68. }
  69. public static void main(String[] args) throws IOException {
  70. scanColumn("Score","course");
  71. }
  72. }

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

        修改表tableName,行row,列column指定的单元格的数据。

(5)deleteRow(String tableName, String row)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/603571
推荐阅读
相关标签
  

闽ICP备14008679号