hive指定行分割符和列分隔符
来源:互联网 发布:电子书制作软件哪个好 编辑:程序博客网 时间:2024/05/24 15:40
指定行分割符和列分隔符
由于默认的是能指定列分隔符,但是不可以指定行分隔符,所以这个时候,我们存在hdfs上的数据有的可能是\001是列分隔符,和\002是分隔符这个时候就得重写一下inputformat来使用了。(当然还有其他的方式,比如书上说serDe 来做)
package com.hcr.hadoop.hive; import java.io.IOException;import java.io.UnsupportedEncodingException; 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.LineRecordReader;import org.apache.hadoop.mapred.RecordReader;import org.apache.hadoop.mapred.Reporter;import org.apache.hadoop.mapred.TextInputFormat; public class MyHiveInputFormat extends TextInputFormat implements JobConfigurable { public RecordReader<LongWritable, Text> getRecordReader( InputSplit genericSplit, JobConf job, Reporter reporter) throws IOException { reporter.setStatus(genericSplit.toString());// return new LineRecordReader(job, (FileSplit) genericSplit, decode(job.get("temp.line.record.delimiter")).getBytes("UTF-8")); return new LineRecordReader(job, (FileSplit) genericSplit, "\002".getBytes("UTF-8")); } /** * 工作流传过来的列分隔符,有可能是特殊字符,用八进制或者十六进制表示 * * @throws IOException */ public static String decode(String str) throws IOException { String re = str; if (str != null && str.startsWith("\\")) { str = str.substring(1, str.length()); String[] chars = str.split("\\\\"); byte[] bytes = new byte[chars.length]; for (int i = 0; i < chars.length; i++) { if (chars[i].equals("t")) { bytes[i] = 9; } else if (chars[i].equals("r")) { bytes[i] = 13; } else if (chars[i].equals("n")) { bytes[i] = 10; } else if (chars[i].equals("b")) { bytes[i] = 8; } else { bytes[i] = Byte.decode(chars[i]); } } try { re = new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IOException(str, e); } } return re; }}
我上边是\002是写死的上边,为了测试用。其实可以写在配置文件中(hive-site.xml)中一个变量来读取比如"temp.line.record.delimiter"
<property> <name>temp.line.record.delimiter</name> <value>\002</value></property>
这样的行分隔符可以来直接使用配置文件取就可以。就是上边的注释掉的代码。
由于没有放入环境变量,先add jar 一下了。
hive> add jar /root/hcr/tmp/hcr.jar;Added /root/hcr/tmp/hcr.jar to class pathAdded resource: /root/hcr/tmp/hcr.jarhive> create table m_t3( mark string, > keyValue string, > batchNo string) row formatdelimited fields terminated by '\001' > stored as INPUTFORMAT 'com.hcr.hadoop.hive.MyHiveInputFormat' > OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';OKTime taken: 2.111 secondshive> load data local inpath'/root/hcr/tmp/sss.txt'overwrite into table m_t3;Copying data fromfile:/root/hcr/tmp/sss.txtCopying file: file:/root/hcr/tmp/sss.txtLoading data to table default.m_t3Moved to trash: hdfs://hadoop-master.TB.com:8020/user/hive/warehouse/m_t3OKTime taken: 0.296 seconds hive> select * from m_t3;keyData XXZXZZ:YSZTZXS:618888:AFS:3853864 d_20131220170748-1600299142keyData XXZXZZ:YSZTZXS:618914:AFS:3853923 d_20131220170748-1600299142hive>
可以在hive-site.xml文件中配置hive.aux.jars.path 参数,让本地jar 只要一启动就注册进去。
<property><name>hive.aux.jars.path</name><value>file:///root/hcr/tmp/hcr.jar</value></property>
其实\001不用指定,hive默认的列分隔符就是\001。不过如果你的数据列之前不是\001可以换成其他的。
37 2
- hive指定行分割符和列分隔符
- pig 指定行分割符和列分隔符号
- hive指定多个字符作为列分隔符
- [Hive]Hive指定查询输出分隔符
- Hive多字符列分割
- Hive多字符分割列
- hive指定多个字符作为列分隔符的问题说明
- hive创建table时指定分隔符
- hive select语句输出指定分隔符
- Hive指定查询输出分隔符
- hive默认分隔符引起的日志分割问题
- join() ~数组转字符串,或用指定分隔符分割
- 以指定分隔符分割字符串存储到vector中
- MFC中按指定分隔符分割CString字符串
- substr 和 find函数实现自己的字符串分割函数(以指定分隔符分割字符串,分隔符可为字符串)
- hive数据导出至本地文件,如何指定分隔符
- hive 创建表——指定分隔符
- 拆分以分隔符分割的单列为多列(行拆分)
- Android开源项目(类库+控件)
- c语言局部静态变量的使用和三个数排序(要求使用if-else语句)
- Android程序结构解析
- cmd命令执行mysql
- 移动应用UI设计的10种模式
- hive指定行分割符和列分隔符
- AsyncTask下载文件
- 推荐几款Mac App
- Introduction to Core Data Programming Guide
- DLL内存分配相关问题
- [Leetcode] Longest Palindromic Substring (Java)
- cocos2d-x 2.1.4 环境搭建->xcode5.0
- GCC最新版安装及错误解决
- jQuery powerSwitch万能slide(切换)插件