hive指定行分割符和列分隔符

指定行分割符和列分隔符

由于默认的是能指定列分隔符,但是不可以指定行分隔符,所以这个时候,我们存在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 path
Added resource: /root/hcr/tmp/hcr.jar
hive> 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';
OK
Time taken: 2.111 seconds
hive> load  data local inpath'/root/hcr/tmp/sss.txt'overwrite into table m_t3;
Copying data fromfile:/root/hcr/tmp/sss.txt
Copying file: file:/root/hcr/tmp/sss.txt
Loading data to table default.m_t3
Moved to trash: hdfs://hadoop-master.TB.com:8020/user/hive/warehouse/m_t3
OK
Time taken: 0.296 seconds
 
hive> select * from m_t3;
keyData XXZXZZ:YSZTZXS:618888:AFS:3853864      d_20131220170748-1600299142
keyData XXZXZZ:YSZTZXS:618914:AFS:3853923      d_20131220170748-1600299142
hive>

可以在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可以换成其他的。

Hive中,可以通过重写InputFormat来指定分隔符。默认情况下,Hive使用换符作为分隔符,而无法指定分隔符。但是,可以通过重写InputFormat来指定列分隔符。例如,如果数据在HDFS上使用\001作为列分隔符,\002作为分隔符,可以通过重写InputFormat来实现。另外,还可以使用SerDe来处理数据格式。\[1\] 在Hive的配置文件中,可以通过设置temp.line.record.delimiter属性来指定分隔符。例如,可以在配置文件中添加以下内容来指定\002作为分隔符: <property> <name>temp.line.record.delimiter</name> <value>\002</value> </property>\[2\] 在Hive中,InputFormat负责将输入数据进格式化,并提供给Hive处理。它的作用类似于Hadoop中的InputFormat。通过重写InputFormat,可以自定义数据的格式化方式,包括指定分隔符等。\[3\] #### 引用[.reference_title] - *1* *2* [hive指定分割符和列分隔符](https://blog.csdn.net/ruishenh/article/details/84515281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [hive创建指定分隔符,不支持多个字符作为分隔符](https://blog.csdn.net/weixin_30872577/article/details/113896936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值