背景
依旧是用户画像的项目,现在标签化的数据存放在hive中,而查询是要在hbase上进行查询,所以需要将hive的数据导入hbase中。
方案:
1、hive和hbase的表建立映射关系,读取的是同一份HDFS文件,只是在上层建立hbase到hive表的映射。
优点:一份数据存储,两种查询模式,数据存储最低;
缺点:底层还是格式化的HDFS文件,查询需要进行映射转换,效率较低;
2、将hive的数据通过生成hfile,通过bulkload导入到hbase,这样底层数据的格式会转变成Hfile存储在hbase中,将hbase完全作为一个数据库去查询
优点:查询效率高;
缺点:同一份数据,两份存储格式,空间换取时间;
介绍
1、环境问题
之前因为各种操作,导致hive的对应的数据存储路径被删了,所以先对hive的环境进行重新配置,主要配置和mysql的互通;
1、删除mysql对应的hive库;
2、执行schematool -dbType mysql -initSchema
3、重启hive
4、查看hive-site的配置
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
2、spark运行环境的配置
在测试的时候,spark的运行环境出现了很多问题,主要是jar包冲突和找不到类的问题。
所以基于hbase的类主要是:
<dependency>
同时spark的代码框架中要加入resouces包,并将hive-site.xml、core-site.xml、hdfs-site.xml、hbase.xml配置文件扔进去,方便spark运行是能够找到依赖的环境。
3、hive映射hbase的表。
在
高威:Spark读写Hbase(用户画像)zhuanlan.zhihu.com这篇文章中将如何像hbase写数据方式介绍了,而且在hbase中建立了一张表:TEST.USER_INFO
现在将这张吧映射到hive中:
建立hive映射表:
CREATE
- stored by指定数据的存储方式。
- SERDEPROPERTIES:表示字段映射,对应hive中的表字段的顺序,需要注意的是 :key指的是Hbase中的rowdy,hive表中要有一个key字段与之对应,否则会报错的。
- TBLPROPERTIES:表示表名映射,指定需要映射的Hbase表名。
具体的映射规则:
- hbase中的空cell在hive中会补null。
- hive和hbase中不匹配的字段会补null。
- hive内部表的数据,由hive自己管理,因此删除hive表,则对应的Hbase表也会被删除。
- hbase对应的hive没有时间戳概念,默认返回最新版本的值。
- 由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型。
- 建表如果没有指定:key,则第一列默认为行健。
建表语句:
查询结果:
在hbase中新增只有两个列的rowKey。
查询结果:
可以看到在不匹配的列中会自动补NULL。
4、整个hbase的map映射到hive
规则和上面基本一样,只不过建立hive表的时候指定的列的类型修改一下。
CREATE
查询结果:
5、spark生成hive表数据
val
在hive上建立hbase的映射表:
CREATE
查看hbase
将hive中user_message_1中的数据导入user_message中
insert
hive中查询结果:
Hbase中查询结果:
这样两边的数据映射成功。
6、查询hive数据写入Hbase
package
结果: