Hive创建表时使用Unicode字符作为字段分隔符(hive unicode character as delimiter)
2014-09-06 18:15
573 查看
最近需要使用分布式数据库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;
我就写了如下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;
相关文章推荐
- arcgis Howto: 用空格作为分隔符提取字符串中的字符并赋值到另一个新字段
- 03-07 创建和编辑AutoCAD实体(七) 向图形中添加文字(4)使用Unicode字符及其他...
- hive指定多个字符作为列分隔符的问题说明
- 解释一下为什么数据文件最好采用单字符作为字段分隔符
- hive 中控制符作为分隔符的使用总结
- 有关hive 中默认的用控制符作为分隔符的使用总结
- hive指定多个字符作为列分隔符
- hive指定多个字符作为列分隔符
- Online Unicode Character Map(在线Unicode字符映射)
- hive创建table时指定分隔符
- 使用replace函数直接替换mysql数据库中某字段中的特定字符
- 属性作为虚字段使用
- C#动态创建和动态使用程序集、类、方法、字段等(一)
- C#动态创建和动态使用程序集、类、方法、字段等(二)
- SQL SERVER中使用Unicode字符的注意问题
- OWB 11g 循序渐进系列 - (2) ETL - 创建Mappings 使用平面文件(Flat File)作为 数据源或者目标源
- 在数据库中使用关键字作为字段名
- Access无法使用time作为字段名称
- C#动态创建和动态使用程序集、类、方法、字段等(一)
- Flex中如何得到一个字符的Unicode编码字符码(Unicode character code)的例子