hive指定多个字符作为列分隔符的问题说明
1、问题:HDFS文件上列分隔符是##,hive建表时直接用##,发现输出的字段和文件不一致。
建表语句如下:
ROW FORMAT DELIMITED FIELDS TERMINATED BY '##'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION'hdfs://nameservice-ha/pgw/gz'
2、原因:hive创建表指定分隔符时,不支持多个字符作为分隔符。
上述就只能用#,简单解决办法就是写个MR程序将两个##改成一个#。
3、解决:Hive要支持多个字符作为分割符,需要自定义InputFormat.,重写next方法。
代码如下:
package com.hive;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobConfigurable;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;public class DefTextInputFormat extends TextInputFormat implements JobConfigurable {public RecordReader<LongWritable, Text> getRecordReader(InputSplit genericSplit, JobConf job, Reporter reporter) throws IOException {reporter.setStatus(genericSplit.toString());return new DefRecordReader((FileSplit)genericSplit, job);}
}
package com.hive;import java.io.IOException;
import java.io.InputStream;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.util.LineReader;public class DefRecordReader implements RecordReader<LongWritable, Text> {private CompressionCodecFactory compressionCodecs = null;private long start;private long pos;private long end;private LineReader lineReader;int maxLineLength;// 构造方法public DefRecordReader(FileSplit inputSplit, Configuration job) throws IOException {maxLineLength = job.getInt("mapred.mutilCharRecordReader.maxlength",Integer.MAX_VALUE);start = inputSplit.getStart();end = start + inputSplit.getLength();final Path file = inputSplit.getPath();// 创建压缩器compressionCodecs = new CompressionCodecFactory(job);final CompressionCodec codec = compressionCodecs.getCodec(file);// 打开文件系统FileSystem fs = file.getFileSystem(job);FSDataInputStream fileIn = fs.open(file);boolean skipFirstLine = false;if (codec != null) {lineReader = new LineReader(codec.createInputStream(fileIn), job);end = Long.MAX_VALUE;} else {if (start != 0) {skipFirstLine = true;--start;fileIn.seek(start);}lineReader = new LineReader(fileIn, job);}if (skipFirstLine) {start += lineReader.readLine(new Text(), 0,(int) Math.min((long) Integer.MAX_VALUE, end - start));}this.pos = start;}public DefRecordReader(InputStream in, long offset, long endOffset, int maxLineLength) {this.maxLineLength = maxLineLength;this.start = offset;this.lineReader = new LineReader(in);this.pos = offset;this.end = endOffset;}public DefRecordReader(InputStream in, long offset, long endOffset, Configuration job) throws IOException {this.maxLineLength = job.getInt("mapred.mutilCharRecordReader.maxlength", Integer.MAX_VALUE);this.lineReader = new LineReader(in, job);this.start = offset;this.end = endOffset;}@Overridepublic void close() throws IOException {if (lineReader != null)lineReader.close();}@Overridepublic LongWritable createKey() {return new LongWritable();}@Overridepublic Text createValue() {return new Text();}@Overridepublic long getPos() throws IOException {return pos;}@Overridepublic float getProgress() throws IOException {if (start == end) {return 0.0f;} else {return Math.min(1.0f, (pos - start) / (float) (end - start));}}@Override//重构next方法,处理行中字符,将多个列分割字符变成1个列分割字符public boolean next(LongWritable key, Text value) throws IOException {while (pos < end) {key.set(pos);int newSize = lineReader.readLine(value, maxLineLength,Math.max((int) Math.min(Integer.MAX_VALUE, end - pos),maxLineLength));// 把字符串中的"##"转变为"#"String strReplace = value.toString().replace("##", "#");Text txtReplace = new Text();txtReplace.set(strReplace);value.set(txtReplace.getBytes(), 0, txtReplace.getLength());if (newSize == 0)return false;pos += newSize;if (newSize < maxLineLength)return true;}return false;}
}
在建表时,指定com.hive.DefTextInputFormat类为INPUTFORMAT 。
当然要先将这两个类打包成jar部署到Hive的运行环境中,可参考http://blog.csdn.net/fjssharpsword/article/details/70271671
hive指定多个字符作为列分隔符的问题说明相关推荐
- hive的列分隔符和行分隔符的使用
目录 一.Hive中默认的分割符如下 二.分隔符的指定与使用 三.建好表之后更改字段分隔符 一.Hive中默认的分割符如下 分隔符 描述 \n 行分隔符 ^A 字段分隔符 \001 ^B array. ...
- 详解hive的列分隔符和行分隔符的使用
hive中在创建表时,一般会根据导入的数据格式来指定字段分隔符和列分隔符.一般导入的文本数据字段分隔符多为逗号分隔符或者制表符(但是实际开发中一般不用着这种容易在文本内容中出现的的符号作为分隔符),当 ...
- Hive的列分隔符和行分隔符
在创建Hive表时,默认行分隔符"^A",列分隔符"\n",这两项也是可以设置的.在实际开发中,一般默认使用默认的分隔符,当然有些场景下也会自定义分隔符. 创建 ...
- 解释一下为什么数据文件最好采用单字符作为字段分隔符
本文出处:http://blog.csdn.net/chaijunkun/article/details/17279565,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议 ...
- hive 十六进制转十进制_Hive使用十六进制分隔符异常分析
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.问题描述 通过sqoop抽取Mysql表数据到hive表,发现hive表所有列显示为null Hive表的分隔符为"\u0 ...
- hive 十六进制转十进制_0026-Hive使用十六进制分隔符异常分析
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.问题描述 通过sqoop抽取Mysql表数据到hive表,发现hive表所有列显示为null Hive表的分隔符为"u00 ...
- Hive表结构操作(增加列,删除列,修改列,移动列)
前言 Hive 表结构操作 内容 1.给hive表中添加某个字段: 格式: alter table 表名 add columns (字段名 字段类型 comment '字段描述'): 示例1: alt ...
- 创建数据库,指定数据库的字符集和编码顺序
创建数据库,指定它的字符集和编码顺序 create database {数据库名称} CHARACTER SET {字符集} COLLATE {排序规则} 举例: create database co ...
- R语言删除包含缺失值的行并将字符数据列(character)转化为因子列(factor)实战
R语言删除包含缺失值的行并将字符数据列(character)转化为因子列(factor)实战 目录
最新文章
- JavaScript自动设置IFrame高度(兼容各主流浏览器)
- 论文浅尝 | 当知识图谱遇上零样本学习——零样本学习综述
- 【模板】高精度 [高精度]
- R语言学习笔记(八)判别分析
- ios系统定义的url
- lxterminal命令打开新窗口并执行python脚本
- Express框架学习笔记-静态资源的处理
- android 使用ffmpeg 调用命令实现视频转gif(ffmpeg 学习三)
- JAVA动态申请数组
- 软件测试 -- 软件缺陷记录的5C原则
- momentum chrome 插件安装
- 一文了解线控制动市场格局——7家公司10款产品盘点
- 用C语言对数据或文件内容进行加密
- HTML form元素
- 面向对象_猫狗案例加入跳高功能代码实现
- 微信小程序-MD5加密
- Emmy Noether传记资料(2010-01-27 23:37:43)
- 传智博客(JavaWeb方面的所有知识)听课记录(经典)
- Wannafly Winter Camp Day 3 G排列(贪心)
- barrier linux,Linux Barrier I/O
热门文章
- unity调用普通java类_Unity中C#和Java的相互调用实例代码
- 导致溢出_由整数类型溢出导致的英雄联盟峡谷惨案
- 线性代数第五版吉尔伯特课后答_线性代数同济第五版第四章课后习题答案!
- Windows服务器下升级PHP版本的方法
- 为什么大多数公司都不重视技术?
- No changes detected
- LDAP和Implementation
- 解决 vue路由跳转到新页面底部而不是顶部和后退到首页就不让他继续后退了
- TorgoiseGit配置ssh密钥
- basis--IMG后台如何显示事务码(How to display IMG's Tcode)