请教一个问题,hive导入hbase时,中文变成了乱码应该如何解决。。

还有一个问题,加假如hive表有5列,有一列是
1,,,,,
意思就是id为1的那一行5列都是空的,那么导入hbase时id也是空的么?
CREATE EXTERNAL TABLE hive_test (rowkey string, c1 string,c2 string, c3 string,c4 string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,C:f1,C:f2,C:f3,C:f4")
TBLPROPERTIES("hbase.table.name" = "test");
中间表,之后建hive表把hive表insert into到中间表。。

fish - Hadooper

赞同来自: Christopher

hbase中的数据没有schema,以字节数组方式存储。 存进去是什么样的数组,读出来还是什么数组。   所谓“中文变成乱码”,是你将String编码成byte[]存进HBase时使用的编码方法,跟将byte[]转回String时使用的不一致导致的吧?

fish - Hadooper

赞同来自: Christopher

能再明确下问题么?在hive里面已经是乱码了?是列名中有中文而不是内容中有中文? 给个例子看看?

fish - Hadooper

赞同来自: Christopher

在进行type mapping的定义中,已经指定好了columns名字为C:f1,C:f2,C:f3,C:f4,按道理,即使内容中有中文,也不会影响hbase中的列名(最多只是影响value)。   在我环境中做了跟你类似的操作,由于有一些细节跟你不太一样,我把我的操作列举如下,你在你的环境中试试吧。   1. 原始hive表:
hive> create table sogouqueryfish(time varchar(8), userid varchar(30), query string, pagerank int, clickrank int, site string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location 'hdfs://DX2-1:8020/tmp/hive/sq';
OK
Time taken: 0.077 seconds
hive> select * from sogouqueryfish;
OK
00:00:00        2982199073774412        [360安全卫士]   8       3       download.it.com.cn/softweb/software/firewall/antivirus/20067/17938.html
00:00:00        07594220010824798       [哄抢救灾物资]  1       1       news.21cn.com/social/daqian/2008/05/29/4777194_1.shtml
00:00:00        5228056822071097        [75810部队]     14      5       www.greatoo.com/greatoo_cn/lis ... %25C5
00:00:00        6140463203615646        [绳艺]  62      36      www.jd-cd.com/jd_opus/xx/200607/706.html

2. 创建所谓的“hive中间表”xyz,我的操作跟你不太一样,并没有手动的去创建hbase,而是直接在hive中执行create table:
hive> CREATE TABLE hbase_table_1(key string, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
这里,因为要对HBase进行输出操作,所以我定义了hbase.mapred.output.outputtable。   3. 在hbase中检查一下xyz是否生成:
hbase(main):005:0> describe 'xyz'
Table xyz is ENABLED                                                                                                                  
xyz                                                                                                                                   
COLUMN FAMILIES DESCRIPTION                                                                                                           
{NAME => 'cf1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE',
 MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true
'}                                                                                                                                    
1 row(s) in 0.1410 seconds
4. 执行insert override插入数据:
hive> INSERT OVERWRITE TABLE hbase_table_1 SELECT userid, query FROM sogouqueryfish WHERE pagerank=8;
5. 任务完成之后,在hive中执行select验证插入的数据:
hive> select * from hbase_table_1;
OK
2982199073774412        [360安全卫士]
Time taken: 0.04 seconds, Fetched: 1 row(s)
6. 在hbase中查询数据:
hbase(main):006:0> scan 'xyz'
ROW                                COLUMN+CELL                                                                                        
 2982199073774412                  column=cf1:val, timestamp=1458477087425, value=[360\xE5\xAE\x89\xE5\x85\xA8\xE5\x8D\xAB\xE5\xA3\xAB
                                   ]                                                                                                  
1 row(s) in 0.0440 seconds
 

mopishv0 - 高级开发工程师@美团

赞同来自: Christopher

自己手动输入时会有问题么?

Christopher

赞同来自:

hive导入hbase后,中文列名都变成问号了。。而且中文列名的都没导进去。。难道hbase和hive都不支持中文列名么?

Christopher

赞同来自:

18948065142                                  column=C:3??/????, timestamp=1458454509226, value=                                                                                     13488067142                                  column=C:3??/SSD????, timestamp=1458454509226, value=                                                                                  18188885142                                  column=C:3???, timestamp=1458454509226, value=                                                                                         11188060142                                  column=C:3???/?, timestamp=1458454509226, value=                                                                                       18980987142                                  column=C:3???/??, timestamp=1458454509226, value=                                                                                      18988345672                                  column=C:3???/???, timestamp=1458454509226, value=                                                                                     18988123142                                  column=C:3???/????, timestamp=1458454509226, value=                                                                       这种的,问号是列名,hive中都是正常的,但是导入hbase后就变成了问号。而且列值都是空的,hive中列值是数字。           

fish - Hadooper

赞同来自:

使用什么工具进行的导入操作呢?自己写的还是sqoop之类的其他工具?

fish - Hadooper

赞同来自:

HBaseStorageHandler用于让Hive访问已经存在的HBase表,其定义了如何将一个hive table与hbase中的rowkey,family,qualifier进行映射,提供查询功能。你的导出操作是什么样子的?

Christopher

赞同来自:

解决啦!谢谢大家

hfeng

赞同来自:

怎么解决的能告诉下吗,我的错误和你是一样的

要回复问题请先登录注册