Hive 数据导入HBase的2中方法详解

最近经常被问到这个问题,所以简单写一下总结。

Hive数据导入到HBase基本有2个方案:

1、HBase中建表,然后Hive中建一个外部表,这样当Hive中写入数据后,HBase中也会同时更新

2、MapReduce读取Hive数据,然后写入(API或者Bulkload)到HBase

1、Hive 外部表

创建hbase表

(1) 建立一个表格classes具有1个列族user

create ‘classes‘,‘user‘

(2) 查看表的构造

hbase(main):005:0> describe ‘classes‘
DESCRIPTION ENABLED
 ‘classes‘, {NAME => ‘user‘, DATA_BLOCK_ENCODING => ‘NONE‘, BLOOMFILTER => ‘ROW‘, REPLICATION_SCOPE => ‘0‘, true
  VERSIONS => ‘1‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, TTL => ‘2147483647‘, KEEP_DELETED_CELLS => ‘
 false‘, BLOCKSIZE => ‘65536‘, IN_MEMORY => ‘false‘, BLOCKCACHE => ‘true‘}

(3) 加入2行数据

put ‘classes‘,‘001‘,‘user:name‘,‘jack‘
put ‘classes‘,‘001‘,‘user:age‘,‘20‘
put ‘classes‘,‘002‘,‘user:name‘,‘liza‘
put ‘classes‘,‘002‘,‘user:age‘,‘18‘

(4) 查看classes中的数据

hbase(main):016:0> scan ‘classes‘
ROW COLUMN+CELL
 001 column=user:age, timestamp=1404980824151, value=20
 001 column=user:name, timestamp=1404980772073, value=jack
 002 column=user:age, timestamp=1404980963764, value=18
 002 column=user:name, timestamp=1404980953897, value=liza

(5) 创建外部hive表,查询验证

create external table classes(id int, name string, age int) 
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘ 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,user:name,user:age") 
TBLPROPERTIES("hbase.table.name" = "classes");

select * from classes;
OK
1 jack 20
2 liza 18

(6)再添加数据到HBase

put ‘classes‘,‘003‘,‘user:age‘,‘1820183291839132‘
hbase(main):025:0> scan ‘classes‘
ROW COLUMN+CELL
 001 column=user:age, timestamp=1404980824151, value=20
 001 column=user:name, timestamp=1404980772073, value=jack
 002 column=user:age, timestamp=1404980963764, value=18
 002 column=user:name, timestamp=1404980953897, value=liza
 003 column=user:age, timestamp=1404981476497, value=1820183291839132

(7)Hive查询,看看新数据

select * from classes;
OK
1 jack 20
2 liza 18
3 NULL NULL    --这里是null了,因为003没有name,所以补位Null,而age为Null是因为超过最大值

(8)如下作为验证

put ‘classes‘,‘004‘,‘user:name‘,‘test‘
put ‘classes‘,‘004‘,‘user:age‘,‘1820183291839112312‘  -- 已经超int了
hbase(main):030:0> scan ‘classes‘
ROW COLUMN+CELL
 001 column=user:age, timestamp=1404980824151, value=20
 001 column=user:name, timestamp=1404980772073, value=jack
 002 column=user:age, timestamp=1404980963764, value=18
 002 column=user:name, timestamp=1404980953897, value=liza
 003 column=user:age, timestamp=1404981476497, value=1820183291839132
 004 column=user:age, timestamp=1404981558125, value=1820183291839112312
 004 column=user:name, timestamp=1404981551508, value=test                   
select * from classes;
1 jack 20
2 liza 18
3 NULL NULL
4 test NULL    -- 超int后也认为是null
put ‘classes‘,‘005‘,‘user:age‘,‘1231342‘
hbase(main):034:0* scan ‘classes‘
ROW COLUMN+CELL
 001 column=user:age, timestamp=1404980824151, value=20
 001 column=user:name, timestamp=1404980772073, value=jack
 002 column=user:age, timestamp=1404980963764, value=18
 002 column=user:name, timestamp=1404980953897, value=liza
 003 column=user:age, timestamp=1404981476497, value=1820183291839132
 004 column=user:age, timestamp=1404981558125, value=1820183291839112312
 004 column=user:name, timestamp=1404981551508, value=test
 005 column=user:age, timestamp=1404981720600, value=1231342   
select * from classes;
1 jack 20
2 liza 18
3 NULL NULL
4 test NULL
5 NULL 1231342

注意点:

1、hbase中的空cell在hive中会补null

2、hive和hbase中不匹配的字段会补null

3、Bytes类型的数据,建hive表示加#b

http://stackoverflow.com/questions/12909118/number-type-value-in-hbase-not-recognized-by-hive

http://www.aboutyun.com/thread-8023-1-1.html

4、HBase CF to hive Map

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

2、MapReduce 写入 HBase

MR写入到HBase有2个常用方法,1是直接调用HBase Api,使用Table 、Put写入;2是通过MR生成HFile,然后Bulkload到HBase,数据量很大的时候推荐使用

注意点:

1、如果需要从hive的路径中读取一些值怎么办

private String reg = "stat_date=(.*?)\\/softid=([\\d]+)/";
private String stat_date;
private String softid;
 ------------厦门map函数中写入-------------
String filePathString = ((FileSplit) context.getInputSplit()).getPath().toString();
///user/hive/warehouse/snapshot.db/stat_all_info/stat_date=20150820/softid=201/000000_0
// 解析stat_date 和softid
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(filePathString);
while(matcher.find()){
	stat_date = matcher.group(1);
	softid = matcher.group(2);
}

2、hive中的map和list怎么处理

hive中的分隔符主要有8种,分别是\001-----> \008

默认    ^A    \001
,       ^B    \002
:       ^C    \003

Hive中保存的Lis,最底层的数据格式为 jerrick,  liza, tom, jerry , Map的数据格式为  jerrick:23, liza:18, tom:0

所以在MR读入时需要简单处理下,例如map需要:   "{"+ mapkey.replace("\002", ",").replace("\003", ":")+"}", 由此再转为JSON, toString后再保存到HBase。

3、简单实例,代码删减很多,仅可参考!

public void map(
				LongWritable key,
				Text value,
				Mapper<LongWritable, Text, ImmutableBytesWritable, KeyValue>.Context context) {
				String filePathString = ((FileSplit) context.getInputSplit()).getPath().toString();
				///user/hive/warehouse/snapshot.db/stat_all_info/stat_date=20150820/softid=201/000000_0
				// 解析stat_date 和softid
				Pattern pattern = Pattern.compile(reg);
				Matcher matcher = pattern.matcher(filePathString);
				while(matcher.find()){
					stat_date = matcher.group(1);
					softid = matcher.group(2);
				}

				rowMap.put("stat_date", stat_date);
				rowMap.put("softid", softid);

				String[] vals = value.toString().split("\001");

				try {
					Configuration conf = context.getConfiguration();
					String cf = conf.get("hbase.table.cf", HBASE_TABLE_COLUME_FAMILY);

					String arow = rowkey; 
					for(int index=10; index < vals.length; index++){
						byte[] row = Bytes.toBytes(arow);
						ImmutableBytesWritable k = new ImmutableBytesWritable(row);
						KeyValue kv = new KeyValue();
						if(index == vals.length-1){
							//dict need 
							logger.info("d is :" + vals[index]);
							logger.info("d is :" + "{"+vals[index].replace("\002", ",").replace("\003", ":")+"}");

							JSONObject json = new JSONObject("{"+vals[index].replace("\002", ",").replace("\003", ":")+"}");
							kv = new KeyValue(row, cf.getBytes(),Bytes.toBytes(valueKeys[index]), Bytes.toBytes(json.toString()));
						}else{
							kv = new KeyValue(row, cf.getBytes(),Bytes.toBytes(valueKeys[index]), Bytes.toBytes(vals[index]));
						}
						context.write(k, kv);
					}

				} catch (Exception e1) {
					context.getCounter("offile2HBase", "Map ERROR").increment(1);
					logger.info("map error:" + e1.toString());
				}

			context.getCounter("offile2HBase", "Map TOTAL").increment(1);

		}
	}

4、bulkload

int jobResult = (job.waitForCompletion(true)) ? 0 : 1;
logger.info("jobResult=" + jobResult);
Boolean bulkloadHfileToHbase = Boolean.valueOf(conf.getBoolean("hbase.table.hfile.bulkload", false));
if ((jobResult == 0) && (bulkloadHfileToHbase.booleanValue())) {
	LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
	loader.doBulkLoad(outputDir, hTable);
}
时间: 2024-10-08 17:39:54

Hive 数据导入HBase的2中方法详解的相关文章

使用sqoop将MySQL数据库中的数据导入Hbase

使用sqoop将MySQL数据库中的数据导入Hbase 前提:安装好 sqoop.hbase. 下载jbdc驱动:mysql-connector-java-5.1.10.jar 将 mysql-connector-java-5.1.10.jar 拷贝到 /usr/lib/sqoop/lib/ 下 MySQL导入HBase命令: sqoop import --connect jdbc:mysql://10.10.97.116:3306/rsearch --table researchers --h

数据导入HBase最常用的三种方式及实践分析

数据导入HBase最常用的三种方式及实践分析         摘要:要使用Hadoop,需要将现有的各种类型的数据库或数据文件中的数据导入HBase.一般而言,有三种常见方式:使用HBase的API中的Put方法,使用HBase 的bulk load工具和使用定制的MapReduce Job方式.本文均有详细描述. [编者按]要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中.常见方式为:使用H

Sqoop将mysql数据导入hbase的血与泪

Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天)  版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blogQQ技术交流群:299142667 一. 问题如何产生 庞老师只讲解了mysql和hdfs,mysq与hive的数据互导,因此决定研究一下将mysql数据直接导入hbase,这时出现了一系列问题. 心酸史: 二. 开始具体解决问题 需求:(将以下这张表数据导入mysql)

Hive 实战(1)--hive数据导入/导出基础

前沿: Hive也采用类SQL的语法, 但其作为数据仓库, 与面向OLTP的传统关系型数据库(Mysql/Oracle)有着天然的差别. 它用于离线的数据计算分析, 而不追求高并发/低延时的应用场景. 最显著的特别是, Hive的数据是Schema On Read, 对数据的写入非常的自由和松散, 而对数据的读取则作了各种限制. 而RMDBS则是Schema On Write, 对数据写入限制非常的严苛. *). 数据导入/导出 让我们体验以下Hive中数据如何导入: 1). 创建数据库 db_

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])  本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   (三)SSIS的简介   (四)数据库中存储过程示例(SSIS应用需要) (五)Excel模板的制作(这步这么简单,稍微介绍一下)   (六)SSIS操作过程(生成Package,用来调用)(下一篇随笔将详细讲解制作Package包的过程,图片太多,篇幅过长,因此本文将直接采用生成的Package包进行

Excel表数据导入Sql Server数据库中

Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型(注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET( 'Microsoft.Jet.OLEDB.4.0 ', 'Excel  5.0;DatabASE=[Excel表

arcgis engine删除数据及数据导入速度较快的方法

最近利用arcgis engine开发一款用于审核软件,需要先进行图形库的建立,还有些原始数据经过一些处理形成需要的数据. 代码实现的过程中发现数据进行过处理以后,数据量比较大,几万条的Feature一条条写入sde库速度让人无法忍受.然后在网上查了不少资料,发现多数类似于shape导入sde的时候都是用游标一条条插入的.但是也找到了一个方法,虽然也需要一些时间,但是总体比游标快太多了,记录在此. 1 /// <summary> 2 /// 图层导入数据集 3 /// </summary

VBS将本地的Excel数据导入到SQL Server中

最近有个测试,需要将本地的Excel数据导入到SQL Server中,所以就写了一个这个脚本,供有需要的同学进行参考.因为在此演示测试,所以准备的数据都比较简单. 我们准备将本地的Excel的A列插入到数据库中的Username列 首先准备本地的Excel数据 然后准备数据库及表结构 开始上脚本 Dim DB,objRecordSet Dim Excel 'SQL Server服务器地址 Dim SQLserver 'SQL Server 数据库 Dim Database 'SQL Server

将 text 文件里的数据导入到 mysql 数据库中

如题,将 text 文件里的数据导入到 mysql 数据库中. 我自己具体的实现可以分为几种了: 1.写你擅长的程序设计语言 进行读写文件,然后连接数据库,进行写入: 2.在 mysql 里直接进行运行 sql 脚本语句,进行导入. 第一个现在就不再说了,简单. 现在就说说怎么直接将 .text 文件利用 sql 语句 进行导入. 1.首先在数据库中新建一个表(这里的表至少要和 你数据里的字段进行匹配,即一行存在的字段数): 2.运行sql脚本语句: 比如: 你的文件为 D:/field.txt