大数据学习笔记之HBase(七):案例设计(新浪微博)

文章目录

  • 四十一、设计案例
    • 41.0 、 牵扯知识点
    • 41.1、牵扯概念:命名空间
      • 41.1.1、命名空间结构图
      • 41.1.2、组成部分
      • 41.1.3、命名空间命令
      • 41.1.4、观察HDFS中的目录结构的变化
    • 41.2、微博项目
      • 41.2.1、需求分析
      • 41.2.2、步骤拆解
      • 41.2.3、代码实现

四十一、设计案例

41.0 、 牵扯知识点

版本上下界、命名空间、rowkey的设计技巧,除了命名空间,剩下的知识点在前面几篇有讲到。

41.1、牵扯概念:命名空间

类似关系型数据库中的schema,通俗来讲就是文件夹,表必须属于命名空间,不能独立存在。
加入现在要做一个微博的项目,就建一个weibo 的命名空间,然后在里面建表,比如私信表,账号表,如果再有其他的业务,比如游戏玩家,再建一个game的命名空间,命名空间里面有palyer表,命名空间的作用是为了将不同的业务逻辑区分开,方便管理

41.1.1、命名空间结构图

大数据学习笔记之HBase(七):案例设计(新浪微博)_第1张图片

41.1.2、组成部分

-Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
-RegionServer group:一个命名空间包含了默认的RegionServer Group。
-Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
-Quota:限额,可以强制一个命名空间可包含的region的数量

41.1.3、命名空间命令

-创建命名空间
例如:
hbase(main):002:0> create_namespace ‘student_namespace’
student_namespace是命名空间名
大数据学习笔记之HBase(七):案例设计(新浪微博)_第2张图片
其实就是一个文件夹,把相同业务逻辑的表放到同一个文件夹里面,就是命名空间。

-创建表时指定命名空间
例如:
hbase(main):004:0> create ‘student_namespace:student_table’,‘student_info’
student_namespace:student_table 命名空间:表名 student_info列族
大数据学习笔记之HBase(七):案例设计(新浪微博)_第3张图片

41.1.4、观察HDFS中的目录结构的变化

如图所示:
大数据学习笔记之HBase(七):案例设计(新浪微博)_第4张图片

41.2、微博项目

41.2.1、需求分析

-微博内容的浏览,数据库表设计
-用户社交体现:关注用户,取关用户
-拉取关注的人的微博内容

41.2.2、步骤拆解

创建命名空间

创建微博内容表
大数据学习笔记之HBase(七):案例设计(新浪微博)_第5张图片
为什么这里是一个版本(详看HBase四,三十五),如果某一个用户在不同的时间发了两条微博,能够将两个版本的微博放在一个单元格中,不会出现覆盖,除非手速特别快能够在十分短的时间单位内发两条微博,但是这种情况基本不存在。rowkey是用户id+时间戳,每一个rowkey不一样,那么单元格中就不需要其他的版本了。
所以还可以存在一种设计方式,rowkey中只有用户id,没有时间戳,在单元格中放多个版本,通过时间戳来判定副本的个数,通过实践戳判断之前的版本中是否有相同的内容。之前的java api put.add(列族,列,内容),还有一个重载的方式put.add(列族,列,内容,时间戳),通过时间来标识版本号,防止相同的数据被覆盖掉。
为什么选当前的这种方案呢?
好维护,rowkey要根据region进行分区,如果只是用户id的话,举个例子,有一天王宝强很火,所有的评论转发都是王宝强的,或者某个人是做代购的,每天都发很多的微博,rowkey如果只有用户id的话,如何进行分区?region是通过rowkey进行分区的,现在rowkey只有一个用户id,这个数据将会十分庞大,region将会特别臃肿。所以一般rowkey都是复合键设计
大数据学习笔记之HBase(七):案例设计(新浪微博)_第6张图片

创建用户关系表
大数据学习笔记之HBase(七):案例设计(新浪微博)_第7张图片
rowkey是用户id,因为用户的数量是有限的,用户id是后台生成的,肯定不能使用户昵称,是会重复的,还可能有问题,生成的时候不是散列式的(HBase六,四十),总体来说用户id是不能重复的并且是散列的
为什么没有加入时间戳?因为上面的微博内容的表是可能一个用户发布重复的内容,而这里的用户是不可能重复的。

大数据学习笔记之HBase(七):案例设计(新浪微博)_第8张图片
把关注的和被关注的人的id当做列名,值也是对应的关注的和被关注的人的id
比如第一个关注的用户的id是1,第二个关注的用户的id是2,第三个关注的用户的id是3。

创建用户微博内容接收邮件表
大数据学习笔记之HBase(七):案例设计(新浪微博)_第9张图片
微博显示所有关注的人的动态的方式
大数据学习笔记之HBase(七):案例设计(新浪微博)_第10张图片

发布微博内容
a、微博内容表中添加1条数据
b、微博收件箱表对所有粉丝用户添加数据

添加关注用户
a、在微博用户关系表中,对当前主动操作的用户添加新关注的好友
b、在微博用户关系表中,对被关注的用户添加新的粉丝
c、微博收件箱表中添加所关注的用户发布的微博

移除(取关)用户
a、在微博用户关系表中,对当前主动操作的用户移除取关的好友(attends)
b、在微博用户关系表中,对被取关的用户移除粉丝
c、微博收件箱中删除取关的用户发布的微博

获取关注的人的微博内容
a、从微博收件箱中获取所关注的用户的微博RowKey
b、根据获取的RowKey,得到微博内容

41.2.3、代码实现

见代码。

WeiBo.java

package com.z.hbase.weibo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HConnection;
import org.apache.hadoop.hbase.client.HConnectionManager;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.util.Bytes;

public class WeiBo {
	//获取配置conf
	private Configuration conf = HBaseConfiguration.create();
	
	//微博内容表的表名
	private static final byte[] TABLE_CONTENT = Bytes.toBytes("weibo:content");
	//用户关系表的表名
	private static final byte[] TABLE_RELATIONS = Bytes.toBytes("weibo:relations");
	//微博收件箱表的表名
	private static final byte[] TABLE_RECEIVE_CONTENT_EMAIL = Bytes.toBytes("weibo:receive_content_email");
	
	public void initTable(){
		initNamespace();
		createTableContent();
		createTableRelations();
		createTableReceiveContentEmail();
	}
	
	/**
	 * 初始化命名空间
	 * @param args
	 */
	public void initNamespace(){
		HBaseAdmin admin = null;
		try {
			admin = new HBaseAdmin(conf);
			//命名空间类似于关系型数据库中的schema,可以想象成文件夹
			NamespaceDescriptor weibo = NamespaceDescriptor
					//创建命名空间,后面是名字
					.create("weibo")
					//添加作者
					.addConfiguration("creator", "Jinji")
					//添加创建时间 ,后面的时间应该是一个字符串
					.addConfiguration("create_time", System.currentTimeMillis() + "")
					.build();
			admin.createNamespace(weibo);
		} catch (MasterNotRunningException e) {
			e.printStackTrace();
		} catch (ZooKeeperConnectionException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
		//最后如果admin不是空的话,将其关闭
			if(null != admin){
				try {
					admin.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 创建微博内容表
	 * Table Name:weibo:content
	 * RowKey:用户ID_时间戳
	 * ColumnFamily:info
	 * ColumnLabel:标题	内容		图片URL
	 * Version:1个版本
	 */
	public void createTableContent(){
		HBaseAdmin admin = null;
		try {
			admin = new HBaseAdmin(conf);
			//创建表表述
			HTableDescriptor content = new HTableDescriptor(TableName.valueOf(TABLE_CONTENT));
			//创建列族描述
			HColumnDescriptor info = new HColumnDescriptor(Bytes.toBytes("info"));
			//设置块缓存
			info.setBlockCacheEnabled(true);
			//设置块缓存大小
			info.setBlocksize(2097152);
			//设置压缩方式
//			info.setCompressionType(Algorithm.SNAPPY);
			//设置版本确界
			info.setMaxVersions(1);
			info.setMinVersions(1);
			
			content.addFamily(info);
			admin.createTable(content);
			
		} catch (MasterNotRunningException e) {
			e.printStackTrace();
		} catch (ZooKeeperConnectionException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != admin){
				try {
					admin.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 用户关系表
	 * Table Name:weibo:relations
	 * RowKey:用户ID
	 * ColumnFamily:attends,fans
	 * ColumnLabel:关注用户ID,粉丝用户ID
	 * ColumnValue:用户ID
	 * Version:1个版本
	 */
	public void createTableRelations(){
		HBaseAdmin admin = null;
		try {
			admin = new HBaseAdmin(conf);
			HTableDescriptor relations = new HTableDescriptor(TableName.valueOf(TABLE_RELATIONS));
			
			//关注的人的列族
			HColumnDescriptor attends = new HColumnDescriptor(Bytes.toBytes("attends"));
			//设置块缓存
			attends.setBlockCacheEnabled(true);
			//设置块缓存大小
			attends.setBlocksize(2097152);
			//设置压缩方式
//			info.setCompressionType(Algorithm.SNAPPY);
			//设置版本确界
			attends.setMaxVersions(1);
			attends.setMinVersions(1);
			
			//粉丝列族
			HColumnDescriptor fans = new HColumnDescriptor(Bytes.toBytes("fans"));
			fans.setBlockCacheEnabled(true);
			fans.setBlocksize(2097152);
			fans.setMaxVersions(1);
			fans.setMinVersions(1);
			
			
			relations.addFamily(attends);
			relations.addFamily(fans);
			admin.createTable(relations);
			
		} catch (MasterNotRunningException e) {
			e.printStackTrace();
		} catch (ZooKeeperConnectionException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != admin){
				try {
					admin.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 创建微博收件箱表
	 * Table Name: weibo:receive_content_email
	 * RowKey:用户ID
	 * ColumnFamily:info
	 * ColumnLabel:用户ID-发布微博的人的用户ID
	 * ColumnValue:关注的人的微博的RowKey
	 * Version:1000
	 */
	public void createTableReceiveContentEmail(){
		HBaseAdmin admin = null;
		try {
			admin = new HBaseAdmin(conf);
			
			HTableDescriptor receive_content_email = new HTableDescriptor(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
			HColumnDescriptor info = new HColumnDescriptor(Bytes.toBytes("info"));
			
			info.setBlockCacheEnabled(true);
			info.setBlocksize(2097152);
			info.setMaxVersions(1000);
			info.setMinVersions(1000);
			
			receive_content_email.addFamily(info);;
			admin.createTable(receive_content_email);
		} catch (MasterNotRunningException e) {
			e.printStackTrace();
		} catch (ZooKeeperConnectionException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != admin){
				try {
					admin.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 发布微博
	 * a、微博内容表中数据+1
	 * b、向微博收件箱表中加入微博的Rowkey
	 */
//uid谁发的微博,content微博的内容
	public void publishContent(String uid, String content){
		HConnection connection = null;
		try {
			connection = HConnectionManager.createConnection(conf);
			//a、微博内容表中添加1条数据,首先获取微博内容表描述
			HTableInterface contentTBL = connection.getTable(TableName.valueOf(TABLE_CONTENT));
			//组装Rowkey
			long timestamp = System.currentTimeMillis();
			String rowKey = uid + "_" + timestamp;
			
			Put put = new Put(Bytes.toBytes(rowKey));
			put.add(Bytes.toBytes("info"), Bytes.toBytes("content"), timestamp, Bytes.toBytes(content));
			
			contentTBL.put(put);
			
			//b、向微博收件箱表中加入发布的Rowkey
			//b.1、查询用户关系表,得到当前用户有哪些粉丝
			HTableInterface relationsTBL = connection.getTable(TableName.valueOf(TABLE_RELATIONS));
			//b.2、取出目标数据
			Get get = new Get(Bytes.toBytes(uid));
			get.addFamily(Bytes.toBytes("fans"));
			//得到所有的粉丝
			Result result = relationsTBL.get(get);
			List<byte[]> fans = new ArrayList<byte[]>();
			
			//遍历取出当前发布微博的用户的所有粉丝数据
			for(Cell cell : result.rawCells()){
			//hbase 列是可以动态的增加的,不像关系型数据库,列是指定的。
			//cloneQualifier取出列名,上面讲到这里将粉丝id设置为列名
				fans.add(CellUtil.cloneQualifier(cell));
			}
			//如果该用户没有粉丝,则直接return
			if(fans.size() <= 0) return;
			//开始操作收件箱表
			HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
			//粉丝是byte数组
			List<Put> puts = new ArrayList<Put>();
			for(byte[] fan : fans){
				Put fanPut = new Put(fan);
				fanPut.add(Bytes.toBytes("info"), Bytes.toBytes(uid), timestamp, Bytes.toBytes(rowKey));
				puts.add(fanPut);
			}
			recTBL.put(puts);
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != connection){
				try {
					connection.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 关注用户逻辑
	 * a、在微博用户关系表中,对当前主动操作的用户添加新的关注的好友
	 * b、在微博用户关系表中,对被关注的用户添加粉丝(当前操作的用户)
	 * c、当前操作用户的微博收件箱添加所关注的用户发布的微博rowkey
	 */
	 //uid当前操作的用户的id,要添加的关注用户的id
	public void addAttends(String uid, String... attends){
		//参数过滤,如果是空的或者不合法的就return
		if(attends == null || attends.length <= 0 || uid == null || uid.length() <= 0){
			return;
		}
		
		HConnection connection = null;
		
		try {
			connection = HConnectionManager.createConnection(conf);
			//用户关系表操作对象(连接到用户关系表)
			HTableInterface relationsTBL = connection.getTable(TableName.valueOf(TABLE_RELATIONS));
			List<Put> puts = new ArrayList<Put>();
			//a、在微博用户关系表中,添加新关注的好友
			Put attendPut = new Put(Bytes.toBytes(uid));
			for(String attend : attends){
				//为当前用户添加关注的人
				//列族、列、内容,这里列名、内容都是添加的关注的人
				attendPut.add(Bytes.toBytes("attends"), Bytes.toBytes(attend), Bytes.toBytes(attend));
				//b、为.  被关注的人,添加粉丝
				Put fansPut = new Put(Bytes.toBytes(attend));
				fansPut.add(Bytes.toBytes("fans"), Bytes.toBytes(uid), Bytes.toBytes(uid));
				//将所有关注的人一个一个的添加到puts(List)集合中
				puts.add(fansPut);
			}
			puts.add(attendPut);
			relationsTBL.put(puts);
			
			//c.1、微博收件箱添加关注的用户发布的微博内容(content)的rowkey
			HTableInterface contentTBL = connection.getTable(TableName.valueOf(TABLE_CONTENT));
			Scan scan = new Scan();
			//用于存放取出来的关注的人所发布的微博的rowkey
			List<byte[]> rowkeys = new ArrayList<byte[]>();
			
			for(String attend : attends){
				//过滤扫描rowkey,即:前置位匹配被关注的人的uid_
				RowFilter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(attend + "_"));
				//为扫描对象指定过滤规则
				scan.setFilter(filter);
				//通过扫描对象得到scanner
				ResultScanner result = contentTBL.getScanner(scan);
				//迭代器遍历扫描出来的结果集
				Iterator<Result> iterator = result.iterator();
				while(iterator.hasNext()){
					//取出每一个符合扫描结果的那一行数据
					Result r = iterator.next();
					for(Cell cell : r.rawCells()){
						//将得到的rowkey放置于集合容器中
						rowkeys.add(CellUtil.cloneRow(cell));
					}
					
				}
			}
			
			//c.2、将取出的微博rowkey放置于当前操作用户的收件箱中
			if(rowkeys.size() <= 0) return;
			//得到微博收件箱表的操作对象
			HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
			//用于存放多个关注的用户的发布的多条微博rowkey信息
			List<Put> recPuts = new ArrayList<Put>();
			for(byte[] rk : rowkeys){
				Put put = new Put(Bytes.toBytes(uid));
				//uid_timestamp
				String rowKey = Bytes.toString(rk);
				//借取uid
				String attendUID = rowKey.substring(0, rowKey.indexOf("_"));
				long timestamp = Long.parseLong(rowKey.substring(rowKey.indexOf("_") + 1));
				//将微博rowkey添加到指定单元格中
				put.add(Bytes.toBytes("info"), Bytes.toBytes(attendUID), timestamp, rk);
				recPuts.add(put);
			}
			
			recTBL.put(recPuts);
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null != connection){
				try {
					connection.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 取消关注(remove)
	 * a、在微博用户关系表中,对当前主动操作的用户删除对应取关的好友
	 * b、在微博用户关系表中,对被取消关注的人删除粉丝(当前操作人)
	 * c、从收件箱中,删除取关的人的微博的rowkey
	 * 
	 */
	 //当前所有的逻辑都是当前操作的用户,不是被取关的人
	public void removeAttends(String uid, String... attends){
		//过滤数据
		if(uid == null || uid.length() <= 0 || attends == null || attends.length <= 0) return;
		HConnection connection = null;
		
		try {
			connection = HConnectionManager.createConnection(conf);
			//a、在微博用户关系表中,删除已关注的好友
			HTableInterface relationsTBL = connection.getTable(TableName.valueOf(TABLE_RELATIONS));
			
			//待删除的用户关系表中的所有数据
			List<Delete> deletes = new ArrayList<Delete>();
			//当前取关操作者的uid对应的Delete对象
			Delete attendDelete = new Delete(Bytes.toBytes(uid));
			//遍历取关,同时每次取关都要将被取关的人的粉丝-1
			for(String attend : attends){
				attendDelete.deleteColumn(Bytes.toBytes("attends"), Bytes.toBytes(attend));
				//b
				Delete fansDelete = new Delete(Bytes.toBytes(attend));
				fansDelete.deleteColumn(Bytes.toBytes("fans"), Bytes.toBytes(uid));
				deletes.add(fansDelete);
			}
			
			deletes.add(attendDelete);
			relationsTBL.delete(deletes);
			
			//c、删除取关的人的微博rowkey 从 收件箱表中
			HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
			
			Delete recDelete = new Delete(Bytes.toBytes(uid));
			for(String attend : attends){
				recDelete.deleteColumn(Bytes.toBytes("info"), Bytes.toBytes(attend));
			}
			recTBL.delete(recDelete);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取微博实际内容
	 * a、从微博收件箱中获取所有关注的人的发布的微博的rowkey
	 * b、根据得到的rowkey去微博内容表中得到数据
	 * c、将得到的数据封装到Message对象中
	 */
	public List<Message> getAttendsContent(String uid){
		HConnection connection = null;
		try {
			connection = HConnectionManager.createConnection(conf);
			HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
			//a、从收件箱中取得微博rowKey
			Get get = new Get(Bytes.toBytes(uid));
			//设置最大版本号
			get.setMaxVersions(5);
			List<byte[]> rowkeys = new ArrayList<byte[]>();
			Result result = recTBL.get(get);
			for(Cell cell : result.rawCells()){
				rowkeys.add(CellUtil.cloneValue(cell));
			}
			//b、根据取出的所有rowkey去微博内容表中检索数据
			HTableInterface contentTBL = connection.getTable(TableName.valueOf(TABLE_CONTENT));
			List<Get> gets = new ArrayList<Get>();
			//根据rowkey取出对应微博的具体内容
			for(byte[] rk : rowkeys){
				Get g = new Get(rk);
				gets.add(g);
			}
			//得到所有的微博内容的result对象
			Result[] results = contentTBL.get(gets);
			
			List<Message> messages = new ArrayList<Message>();
			for(Result res : results){
				for(Cell cell : res.rawCells()){
					Message message = new Message();
					
					String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
					String userid = rowKey.substring(0, rowKey.indexOf("_"));
					String timestamp = rowKey.substring(rowKey.indexOf("_") + 1);
					String content = Bytes.toString(CellUtil.cloneValue(cell));
					
					message.setContent(content);
					message.setTimestamp(timestamp);
					message.setUid(userid);
					
					messages.add(message);
				}
			}
			
			return messages;
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				connection.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	/**
	 * 发布微博内容
	 * 添加关注
	 * 取消关注
	 * 展示内容
	 */
	
	public void testPublishContent(WeiBo wb){
		wb.publishContent("0001", "今天买了一包空气,送了点薯片,非常开心!!");
		wb.publishContent("0001", "今天天气不错。");
	}
	
	public void testAddAttend(WeiBo wb){
		wb.publishContent("0008", "准备下课!");
		wb.publishContent("0009", "准备关机!");
		wb.addAttends("0001", "0008", "0009");
	}
	
	public void testRemoveAttend(WeiBo wb){
		wb.removeAttends("0001", "0008");
	}
	
	public void testShowMessage(WeiBo wb){
		List<Message> messages = wb.getAttendsContent("0001");
		for(Message message : messages){
			System.out.println(message);
		}
	}

	public static void main(String[] args) {
		WeiBo weibo = new WeiBo();
		weibo.initTable();	
		
		weibo.testPublishContent(weibo);
		weibo.testAddAttend(weibo);
		weibo.testShowMessage(weibo);
		weibo.testRemoveAttend(weibo);
		weibo.testShowMessage(weibo);
	}

}

创建完命名空间之后main函数调用先测试下是否创建成功
大数据学习笔记之HBase(七):案例设计(新浪微博)_第11张图片
Message.java

package com.z.hbase.weibo;

public class Message {
	private String uid;
	private String timestamp;
	private String content;
	
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getTimestamp() {
		return timestamp;
	}
	public void setTimestamp(String timestamp) {
		this.timestamp = timestamp;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	@Override
	public String toString() {
		return "Message [uid=" + uid + ", timestamp=" + timestamp + ", content=" + content + "]";
	}
	
}

你可能感兴趣的:(Big,Data,Cloud,Technology❤️,#,Big,Data,------,HBase)