HBase 3、HBase练习题
1、建立学生和课程表
要求:学生可以选择多个课程,每个课程可以被多个学生选择。
查询某个学生所选的所有课程列表
查询某个课程,的学生列表
学生可以修改所选的课程
方案:学生与课程之间是多对多关系,那可以建三张表 学生表、课程表、学生课程关系表
查询某个学生所选的所有课程列表:通过学生ID到学生课程表中去匹配RowKey为studentxxx的记录,然后再根据获取到的记录可以得到课程ID(即RowKey_后的部分);
然后再根据课程ID获取到课程的名称等内容;
查询某个课程,的学生列表:通过课程ID到学生课程表中去匹配RowKey为coursexxx的记录,然后再根据获取到的记录可以得到学生ID(即RowKey_前的部分);
然后再根据学生ID获取到课程的名称等内容;
学生可以修改所选的课程:学生修改课程,无非有两种情况1.学生新添加了课程;2.学生去掉了课程;因此只要对学生课程表中的数据进行删除或者添加即可;另外两个表数据
不需要做任何更改;
下面是代码:
// 学生表的创建与维护
public class Zuoye2_0 {
public static Connection conn = null;
public static TableName tName = TableName.valueOf("t_student");
public static Random ra = new Random();
@Before
public void init() throws IOException{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "node5,node6,node7");
conn = ConnectionFactory.createConnection(conf);
}
@Test
public void create() throws IOException{
Admin admin = conn.getAdmin();
if(admin.tableExists(tName)){
admin.disableTable(tName);
admin.deleteTable(tName);
}
HTableDescriptor ht = new HTableDescriptor(tName);
HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
hc.setMaxVersions(5);
hc.setBlockCacheEnabled(true);
hc.setBlocksize(180000); ht.addFamily(hc);
admin.createTable(ht);
System.out.println("表创建完成");
} @Test
public void insert() throws IOException{
Table table = conn.getTable(tName);
List<Put> putList = new ArrayList<Put>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(int i=1;i<20;i++){
String id=format.format(new Date());
id=id.replace("-", "").replace(" ", "").replace(":", "");
id = "student"+getRowKey(id);
Put put = new Put(id.getBytes());
String name="Tom"+i;
put.addColumn("cf1".getBytes(), "name".getBytes(), name.getBytes());
putList.add(put);
}
table.put(putList);
System.out.println("数据插入完成");
} @After
public void after() throws IOException {
if(conn!=null){
conn.close();
}
}
private String getRowKey(String id){
return id+""+ra.nextInt(99999);
}
}
// 课程表的创建与维护
public class Zuoye2_1 {
public static Connection conn = null;
public static TableName tName = TableName.valueOf("t_course");
public static Random ra = new Random();
@Before
public void init() throws IOException{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "node5,node6,node7");
conn = ConnectionFactory.createConnection(conf);
}
@Test
public void create() throws IOException{
Admin admin = conn.getAdmin();
if(admin.tableExists(tName)){
admin.disableTable(tName);
admin.deleteTable(tName);
}
HTableDescriptor ht = new HTableDescriptor(tName);
HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
hc.setMaxVersions(5);
hc.setBlockCacheEnabled(true);
hc.setBlocksize(180000); ht.addFamily(hc);
admin.createTable(ht);
System.out.println("表创建完成");
} @Test
public void insert() throws IOException{
Table table = conn.getTable(tName);
List<Put> putList = new ArrayList<Put>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(int i=1;i<10;i++){
String id=format.format(new Date());
id=id.replace("-", "").replace(" ", "").replace(":", "");
id = "course"+getRowKey(id);
Put put = new Put(id.getBytes());
String name="Course"+i;
put.addColumn("cf1".getBytes(), "name".getBytes(), name.getBytes());
putList.add(put);
}
table.put(putList);
System.out.println("数据插入完成");
} @After
public void after() throws IOException {
if(conn!=null){
conn.close();
}
}
private String getRowKey(String id){
return id+""+ra.nextInt(99999);
}
}
// http://blog.csdn.net/hugengyong/article/details/38148373
// 学生课程表的维护与查询
public class Zuoye2_2 {
public static Connection conn = null;
public static TableName tName = TableName.valueOf("t_student_course");
public static TableName tStudent = TableName.valueOf("t_student");
public static TableName tCourse = TableName.valueOf("t_course");
public static Random ra = new Random();
@Before
public void init() throws IOException{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "node5,node6,node7");
conn = ConnectionFactory.createConnection(conf);
}
@Test
public void create() throws IOException{
Admin admin = conn.getAdmin();
if(admin.tableExists(tName)){
admin.disableTable(tName);
admin.deleteTable(tName);
}
HTableDescriptor ht = new HTableDescriptor(tName);
HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
hc.setMaxVersions(5);
hc.setBlockCacheEnabled(true);
hc.setBlocksize(180000); ht.addFamily(hc);
admin.createTable(ht);
System.out.println("表创建完成");
} @Test
public void insert() throws IOException{
Table table = conn.getTable(tName);
List<Put> putList = new ArrayList<Put>();
//学生1 student2016030421164483174
String stu1 = "student2016030421164483174";
//学生2 student2016030421164417190
String stu2 = "student2016030421164417190";
//学生3 student2016030421164462988
String stu3 = "student2016030421164462988";
//课程1 2 3 course2016030421165195800 course201603042116517244 course2016030421165117240
Put put1 = new Put("student2016030421164483174_course2016030421165195800".getBytes());
put1.addColumn("cf1".getBytes(), "student".getBytes(), stu1.getBytes());
Put put2 = new Put("student2016030421164483174_course201603042116517244".getBytes());
put2.addColumn("cf1".getBytes(), "student".getBytes(), stu1.getBytes());
Put put3 = new Put("student2016030421164483174_course2016030421165117240".getBytes());
put3.addColumn("cf1".getBytes(), "student".getBytes(), stu1.getBytes());
Put put4 = new Put("student2016030421164417190_course2016030421165195800".getBytes());
put4.addColumn("cf1".getBytes(), "student".getBytes(), stu2.getBytes());
Put put5 = new Put("student2016030421164417190_course201603042116517244".getBytes());
put5.addColumn("cf1".getBytes(), "student".getBytes(), stu2.getBytes());
Put put6 = new Put("student2016030421164462988_course2016030421165195800".getBytes());
put6.addColumn("cf1".getBytes(), "student".getBytes(), stu3.getBytes());
putList.add(put1);
putList.add(put2);
putList.add(put3);
putList.add(put4);
putList.add(put5);
putList.add(put6);
table.put(putList);
System.out.println("数据插入完成");
} //查询某个学生所选的所有课程列表 学生1
@Test
public void findCourseByStudent() throws IOException{
Table table = conn.getTable(tName);
String stuId="student2016030421164483174";
List<String> courseIds =new ArrayList<String>();
Scan scan = new Scan();
RowFilter rf1 = new RowFilter(CompareOp.EQUAL, new RegexStringComparator(stuId+"_"));
scan.setFilter(rf1);
ResultScanner rs1 = table.getScanner(scan);
Iterator<Result> it = rs1.iterator();
while(it.hasNext()){
Result result = it.next();
byte[] rowKey = result.getRow();
courseIds.add(new String(rowKey,"utf8"));
} for(String id : courseIds){
String courseId = id.split("_")[1];
Table courseTable = conn.getTable(tCourse);
Get get = new Get(courseId.getBytes());
Result result= courseTable.get(get);
byte[] name = result.getValue("cf1".getBytes(), "name".getBytes());
System.out.println("课程ID:"+courseId+" 名称:"+new String(name,"utf8"));
} } //查询某个课程,的学生列表 课程1
@Test
public void findStudentByCourse() throws IOException{
Table table = conn.getTable(tName);
String courseId="course2016030421165195800";
List<String> studentIds =new ArrayList<String>();
Scan scan = new Scan();
RowFilter rf1 = new RowFilter(CompareOp.EQUAL, new RegexStringComparator("_"+courseId));
scan.setFilter(rf1);
ResultScanner rs1 = table.getScanner(scan);
Iterator<Result> it = rs1.iterator();
while(it.hasNext()){
Result result = it.next();
byte[] rowKey = result.getRow();
studentIds.add(new String(rowKey,"utf8"));
} for(String id : studentIds){
String stuId = id.split("_")[0];
Table stuTable = conn.getTable(tStudent);
Get get = new Get(stuId.getBytes());
Result result= stuTable.get(get);
byte[] name = result.getValue("cf1".getBytes(), "name".getBytes());
System.out.println("学生ID:"+courseId+" 名字:"+new String(name,"utf8"));
} }
//学生可以修改所选的课程 将学生1的课程1去掉
@Test
public void changeCourseOfStudent() throws IOException{
String stuId="student2016030421164483174";
String courseId="course2016030421165195800";
String scId=stuId+"_"+courseId;
Delete delete = new Delete(scId.getBytes());
Table table = conn.getTable(tName);
table.delete(delete);
} @After
public void after() throws IOException {
if(conn!=null){
conn.close();
}
} }
2、建立部门表
要求:部门下有多个子部门。查询所有的顶级部门列表,查询某个部门下所有子部门列表,可以修改一个部门的所属父部门。
方案:
1.在RowKey的设计上把是否是顶级部门带入,例:0_001,1_002 0/1代表是还是是子级部门 0不是 1是 这样可以根据RowKey就能查询出所有的顶级部门
2.在部门表中设计了两个列族 cf1 cf2 在cf2中存储当前部门下的所有子部门;在cf2中存储方式是列名是子部门ID 例值也是子部门ID 例:1_002:1_002
这样可以在不进行又迭代的情况下就可以获取一个部门下的子级部门;只要取出该RowKey的cf2列族下的所有列即可;
3.当修改一个部门的父部门的时候,首先先找到该部门的父部门,先把当前的父部门中的cf2列族下的列删除掉,再到新的部门下的cf2列族下添加一个子部门;最后
再修改当前部门的父ID为新的部门ID
设计如下:
3、根据新浪微博系统:请建立微博系统的表
1.用户表不需要创建,假设用户已经存在,在DBMS中。
2.所有用户可以发微博
3.所有用户可以添加关注用户和取消关注用户
4.所有用户可以查看粉丝列表
5.用户首页,用户所关注的其他用户最新发布的微博列表。
方案:
微博表
rowkey cf1
uid_time_wid content
zs_2015_001
sunliu_2016_002
zs_2016_03050102 content
关注表
cf1 关注的人的id cf2 我的粉丝的id
uid 002=002,
zs 002=002, 004,005
sunlie 004
收件箱表(收取我关注的人发布的最新的微博)
rowkey cf1
uid w_rowkey= set max_version=1000
004 w_rowkey=zs_2015_001 w_rowkey=sunliu_2016_002 w_rowkey=sunliu_2016_003
005 w_rowkey=zs_2015_001
只要xx发布了一条新微博,则系统就会向xx的所有粉丝的收件箱中插一条列w_rowkey的内容作为当前最新版本的值;
在收件箱表中可以设置列 w_rowkey 的保存最多副本数MaxVersions 例:w_rowkey最多可保存1000个副本,那么可以通过时间戳倒序排列,就能获取到最近的我关注的人发布的1000条微博内容的内容ID;
HBase 3、HBase练习题的更多相关文章
- 【HBase】HBase Getting Started(HBase 入门指南)
入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...
- Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型
Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...
- HBase学习-HBase原理
1.系统架构 1.1 图解 从HBase的架构图上可以看出,HBase中的组件包括Client.Zookeeper.HMaster.HRegionServer.HRegion.Store.MemS ...
- Hbase理论&&hbase shell&&python操作hbase&&python通过mapreduce操作hbase
一.Hbase搭建: 二.理论知识介绍: 1Hbase介绍: Hbase是分布式.面向列的开源数据库(其实准确的说是面向列族).HDFS为Hbase提供可靠的底层数据存储服务,MapReduce为Hb ...
- Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误
1:Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误,是因为jar包冲突了,所以对于和hadoop的jar包冲 ...
- Hbase记录-Hbase shell使用
HBase Shell HBase包含可以与HBase进行通信的Shell. HBase使用Hadoop文件系统来存储数据.它拥有一个主服务器和区域服务器.数据存储将在区域(表)的形式.这些区域被分割 ...
- Hbase记录-Hbase基础概念
HBase是什么? HBase是建立在Hadoop文件系统之上的分布式面向列的数据库.它是一个开源项目,是横向扩展的. HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数 ...
- File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplication (=1).
File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplication (=1). 这 ...
- HBase TableExistsException: hbase:namespace
这个报错一般存在于独立安装Zookeeper集群中. 报这个错的操作时这样的, 先停掉了了Hbase formatZK后重启Hbase 启动hbase shell 后HMaster挂掉,看log里就有 ...
- 区分 hdfs hbase hive hbase适用场景
区分 hdfs hbase hive hbase适用场景 收藏 八戒_o 发表于 11个月前 阅读 308 收藏 1 点赞 0 评论 0 摘要: hdfs hbase hive hbase适用场景 H ...
随机推荐
- softlayer
- Linux Top 命令
TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况. TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止 ...
- qt坐标系统
#说明:坐标系统是由 QPainter控制的QPaintDevice是那些能够让 QPainter 进行绘制的“东西”(准确的术语叫做,二维空间)# 的抽象层(其子类有QWidget. QPixmap ...
- C++中,访问字符串的三种方法
1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. #include<iostream> using namespace std; int main() ...
- freemarker报错之三
1.错误描写叙述 Expression students is undefined on line 30, column 24 in student.ftl. The problematic inst ...
- 解决angular 与django的冲突
{% block main %} <script type="text/javascript" src="http://cdnjs.cloudflare.com/a ...
- 关于select元素的一些基本知识
为select元素绑定值的几个方法: 一.通过字符串拼接,让后追加到select元素下, 二.通过DOM创建option元素,为其绑上value值和文本: function loadProvinve( ...
- 使用Fiddler捕获Java程序中的HTTP请求
默认Java程序是不支持Fiddler获取请求的,因此需要通过设置代理来实现. Fiddler的端口是8888,若Fiddler没有运行,则会抛出异常. HttpClient4.5示例: ...
- SqlBulkCopy类进行大数据(一万条以上)插入测试
好多天没写博客了,刚刚毕业一个多月! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试.后来查找发 ...
- 插头DP题目泛做(为了对应WYD的课件)
题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #inc ...