我们用三张表来实现
1:内容表
rowkey:uid+“_”+ts
cf:只有一个列族就是info,info里面有一个列content,因为一个人可能发非常多的微博,使用添加列或者多个版本的形式都不适合,value就是微博内容
2:用户关系表
rowkey:uid
cf1:attends 多个列:uid 这个代表了该用户关注了谁,一个用户使用一个列,value也是uid
cf2:fans 多个列:uid 这个代表了该用户的粉丝,一个用户使用一个列,value也是uid
3:微博收件箱表
rowkey:uid
cf:只有一个列族info 列:uid 这个代表了该用户的被关注者的uid,一个用户使用一个列,value里面是该用户的被关注者发布的微博,我们设定3个版本
下面是一些代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>hbase_demo</artifactId>
<groupId>org.hrx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>weibo</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
</project>
常量类Constants
package com.nanxiuzi.constants;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
public class Constants {
//HBase的配置信息
public static final Configuration CONFIGURATION= HBaseConfiguration.create();
//命名空间
public static final String NAMESPACE="weibo";
//微博内容表
public static final String CONTENT_TABLE="weibo:content";
public static final String CONTENT_TABLE_CF="info";
public static final int CONTENT_TABLE_VERSION=1;
//用户关系表
public static final String RELATION_TABLE="weibo:relation";
public static final String RELATION_TABLE_CF1="attends";
public static final String RELATION_TABLE_CF2="fans";
public static final int RELATION_TABLE_VERSION=1;
//收件箱表
public static final String INBOX_TABLE="weibo:inbox";
public static final String INBOX_TABLE_CF="info";
public static final int INBOX_TABLE_VERSION=2;
}
工具类HbaseUtil
package com.nanxiuzi.utils;
import com.nanxiuzi.constants.Constants;
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 HbaseUtil {
/**
* 创建命名空间
* @param nameSpace
*/
public static void createNameSpace(String nameSpace) throws IOException {
/*
公用的工具类,最好还是在具体代码里面获取连接并关闭链接
获取Connection对象
*/
Connection conn = ConnectionFactory.createConnection(Constants.CONFIGURATION);
/*
获取Admin对象
*/
Admin admin = conn.getAdmin();
/*
创建命名空间描述器
*/
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
/*
创建命名空间
*/
admin.createNamespace(namespaceDescriptor);
/*
关闭资源
*/
admin.close();
conn.close();
}
/**
* 判断表是否存在,因为是给创建表方法调用,所以设置成private
* @param tableName
* @return
*/
private static boolean isTableExist(String tableName) throws IOException {
/*
公用的工具类,最好还是在具体代码里面获取连接并关闭链接
获取Connection对象
*/
Connection conn = ConnectionFactory.createConnection(Constants.CONFIGURATION);
/*
获取Admin对象
*/
Admin admin = conn.getAdmin();
/*
判断是否存在
*/
boolean isExist = admin.tableExists(TableName.valueOf(tableName));
/*
关闭资源
*/
admin.close();
conn.close();
/*
返回结果
*/
return isExist;
}
/**
* 创建表
* @param tableName
* @param versions 版本数
* @param cfs 列族
*/
public static void createTable(String tableName,int versions,String ...cfs) throws IOException {
//判断是否传入了列族信息
if(cfs.length==0){