Hive-数据文件分隔符为多字符问题
来源:互联网 发布:淘宝管家官方下载 编辑:程序博客网 时间:2024/06/05 14:13
在网上中文搜索出的结果,多半都是过时解决方法,还是推荐google,stackoverflow。
先上结论:如果是0.14以后的版本,直接用MultiDelimitSerde;否则,偏向于先预处理下源数据文件。
1. 如果是Hive 0.14 (2014-12月发布)以后的版本,就可以用MultiDelimitSerde优雅的解决这个问题。
This issue has been resolved in hive 14 with the use of multidelimiter serde.
Please find documentation here. https://cwiki.apache.org/confluence/display/Hive/MultiDelimitSerDe
【示例 - 分隔符为多字符,比如P9数据的分隔符为 '|@|'】
- CREATE EXTERNAL TABlE tableex(id INT, name STRING)
- ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
- WITH SERDEPROPERTIES ("field.delim”=“|@|")
- STORED AS TEXTFILE LOCATION '/user/myusername';
相关讨论:https://stackoverflow.com/questions/25484015/how-can-i-do-a-double-delimiter-in-hive
2.如果是老版本的Hive,就没有MultiDelimitSerde支持,只能选用以下几种替代方案
1). 使用RegexSerDe, 正则表达式序列化反序列化器
缺点:相较麻烦之处在于需要自己写正则表达式匹配 数据文本的格式;对正则表达式不熟的话,不容易写出正确的捕获组;目前,我也只测试过所有字段为string类型的解析;而且据说解析效率不高;
- drop table test;
- create table test
- (
- id string,
- name string,
- amt string
- )
- row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
- with serdeproperties
- ( 'input.regex' = '(.*)\\|@\\|(.*)\\|@\\|(.*)\\|@\\|' , 'output.format.string' = '%1$s%2$s%3$s ')
- stored as textfile;
当多分割符处理 处理非字符型时,正则表达式的匹配写法!测试一下是否可行!?
- CREATE EXTERNAL TABlE tableex(id INT, name STRING)
- ROW FORMAT 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
- WITH SERDEPROPERTIES (
- "input.regex" = "^(\\d+)~\\*(.*)$"
- )
- STORED AS TEXTFILE
- LOCATION '/user/myusername';
2). 使用自定义 InputFormat,将多字符分隔符 |@| ,替换为 默认的 列分隔符 \001,这种方式网上文章较多,不重复累述
注意:需要先将源文件预处理,将ctrl-a (\001)字符 替换为空,可以使用tr/sed处理。
3). 预处理源文件
I. 先将源文件中的所有ctrl-a (\001)字符 替换为空;
II. 然后将分隔符 |@| 替换为 ctrl-a (\001)字符;
III. 最后按照Hive默认方式进行解析;
4). 使用自定义 SerDe
这种方式以前只试过针对固定的二进制文件(proto格式)写通用的解析器,对于不固定的二维表格式数据文件,感觉就是在重复做MultiDelimitSerde的事情。
阅读全文
0 0
- Hive-数据文件分隔符为多字符问题
- hive serde 解决多字节分隔符
- Hive表如何使用多字符分隔
- hive多分隔符问题
- C++ 以多字符为分隔符分割字符串
- 大数据文件分隔符
- hive多字符分割
- Sqoop导入hive分隔符问题
- Sqoop导入hive分隔符问题
- hive 分隔符 ^A
- Split多字符分隔的用法
- Hive多字符列分割
- Hive多字符分割列
- 换行符分隔字符串,多字符分隔字符串
- hive默认分隔符引起的日志分割问题
- hive 导出数据分隔符
- hive-TextInputformat自定义分隔符
- Hive 默认字段分隔符
- 互联网时代常用网站资源整理汇总(一直在完善中)
- js正则方法test与match简单介绍
- 深度学习(二十五)基于Mutil-Scale CNN的图片语义分割、法向量估计
- springMVC中的拦截器的使用
- c++ 整数n分成k份 递归实现
- Hive-数据文件分隔符为多字符问题
- shell变量详解
- lint/checkstyle/findbugs/pmd使用汇总
- 性能测试的目标
- 关于如何在github的README.md文件内添加图片的教程
- nginx设置反向代理后,页面上的js css文件无法加载
- POI操作Excel示例
- 成长——新的开始,一切都是美好的
- 终于解决了QQ互联总是系统繁忙,请稍后再试的问题。内详!