第一次写文,有什么不足之处还请大家多多指教!!!!
项目需要通过Hbase查询数据,数据存储在Hive中,需要做一步初始化的操作,将历史数据同步到Hbase表中。原先采用的方式如下:
1.建立hive临时表,指定存储格式为Hfile
create table hive_to_hbase(
rowkey varchar(100),
cust_no varchar(100)
cust_name varchar(100)
)
stored as
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHFileOutputFormat' --定义存储格式为Hfile
TBLPROPERTIES('hfile.family.path'='/user/hive/hbase_test/info') --指定Hfile在hdfs上存储路径,hbase_test为habse表名,info为hbase表列族名
2.建立hbase表
create "hbase_test","info"
3. 将历史数据跑到hive临时表,通过命令,将Hfile文件指定到Hbase
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHfiles /user/hive/hbase_test hbase_test
此种方式在数据量较小时,是没有问题的,但是当数据量一大,就存在执行时间长,效率低下的问题,这是难以接受的。
经过一段时间的查资料,有了通过bulkload导入数据的优化方案2:
1.建立hive临时表和hbase表,指定存储格式为textfile,指定字段分隔符
--hive临时表
create table hive_to_hbase(
cust_no varchar(100),
cust_name varchar(100)
)
Row FORMAT DELIMITED FIELDS TERMINATED BY ',' --指定字段分隔符
STORED AS TEXTFILE; --指定存储格式为textfile
alter table hive_to_hbase set serdeproperties('serialization.null.format'=''); --指定hdfs文件存储为空的字段数据时存储为空字符串
--h