Hive创建表时使用Unicode字符作为字段分隔符(hive unicode character as delimiter)

来源:互联网 发布:笔记本电脑测评软件 编辑:程序博客网 时间:2024/04/30 03:37

最近需要使用分布式数据库Hive管理日志数据,原始日志数据使用欧元符号€作为字段分隔符,如下图所示,创建hive表的时候就想指定€作为分隔符,这样就可以不用改变原始日志数据而直接导入hive中。


我就写了如下hive QL创建表,

CREATE TABLE subscription (RowNum BIGINT, UserNum BIGINT, Province STRING, City STRING, PayTime TIMESTAMP, PayType SMALLINT, PayID STRING, PayAmount DOUBLE, ContentPayType SMALLINT, PayContentID STRING, PayMethodType SMALLINT, ClientVersion STRING) clustered by(PayTime) into 32 buckets row format delimited fields terminated by '€' stored as textfile;
成功执行完下面sql语句后,高兴的以为成功导入了,

Load data local inpath'/media/172.16.46.6/changbiao/server/a_10000_*_VGOP1-R2.10-21201_*_*.dat.gz'into table subscription; 

但用select选择几条数据查看的时候,发现没有导入成功,hive不能识别以€作为分隔符,后面各种就是各种分隔符写法(包括'\0x80', '0xFFFD', '\u20AC',....)的尝试,搞了一天,都不行。在百度搜索里实在找不到想要的解决方案,就用Google搜了,后来找到一个如下的英文网页(https://issues.apache.org/jira/browse/HIVE-237)说Hive有个bug:不支持ASCII大于128的字符作为字段分隔符。太坑爹了。



但是,上图红色框中的一句话启发了我:在java中,可以使用负数来表示大于128的分隔符。然后我就找到€的unicode码是0x80,它对应的二进制是10000000,这个二进制如果是表示负数的话对应-128,我就用‘\-128’作为分隔符,执行下面的sql后,再次导入数据居然成功了,嘿嘿。

CREATE TABLE subscription (RowNum BIGINT, UserNum BIGINT, Province STRING, City STRING, PayTime TIMESTAMP, PayType SMALLINT, PayID STRING, PayAmount DOUBLE, ContentPayType SMALLINT, PayContentID STRING, PayMethodType SMALLINT, ClientVersion STRING) clustered by(PayTime) into 32 buckets row format delimited fields terminated by '\-128' stored as textfile;




0 0
原创粉丝点击