`
ruishen
  • 浏览: 52844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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测试数据uaction.rar

    在Hive中,数据通常是存储在分隔符分割的文本文件中,例如CSV或TSV格式,每行代表一条记录,列之间用特定字符(如逗号、制表符)分隔。"uaction.dat"文件可能采用了类似格式,每行记录了一个用户的某个操作,列可能...

    截取用,分割的字符串中的第n个字符串 SQL

    - **返回值**:`nvarchar(1024)`,表示按照指定分隔符分割后的第n个子字符串。 #### 2. **变量声明与初始化** - `@location int`:用于记录分隔符出现的位置。 - `@start int`:记录当前子字符串的起始位置。 -...

    hive入门.pdf

    - **数据存储**:Hive中的数据以文件形式存储在HDFS中,每条记录对应文件中的一行,字段之间通过指定的分隔符进行分割。 - **权限管理**:Hive的权限控制主要基于文件级别,即用户的访问权限取决于他们对文件系统的...

    hive函数大全(举例和目录)

    ### Hive函数大全详解 Hive是一种数据仓库工具,它提供了SQL-like语言(HiveQL)来处理存储在Hadoop文件系统中的大型数据集。本文档将详细介绍Hive中各种常用的函数及其用法,并通过示例帮助理解每个函数的功能。 ...

    hive从入门到放弃(六)——常用文件存储格式.doc

    * 可以用任意分隔符对列分割,建表时需要指定分隔符。 * 不会对文件进行压缩,因此加载数据的时候会比较快,因为不需要解压缩;但也因此更占用存储空间。 二、ORCFile ORCFile 是列式存储的。ORCFile 的特点是: ...

    hive inputformat

    默认情况下,Hive将所有数据视为TextFile格式,这意味着每个行被视为一个记录,每一行由制表符或逗号等分隔符拆分成字段。在我们的例子中,"按照空格对日志文件进行拆分"意味着我们将使用TextFile InputFormat,...

    Esri大数据平台搭建指南之Hive1

    这通常包括创建一个Hive表定义,指定数据的分隔符,然后使用`LOAD DATA`命令将数据加载到HDFS对应的目录下。 5. **执行分析** 分析数据是Hive的主要功能。用户可以使用HQL进行复杂的查询、聚合、过滤和数据转换。...

    1_hive函数大全.pdf

    Hive提供了测量字符串长度的length函数、字符串反转的reverse函数、字符串连接concat函数、带分隔符连接concat_ws函数、字符串截取substr和substring函数、转换大小写的upper/ucase和lower/lcase函数、去除或保留...

    大数据技术之Hive-02(优化).pdf

    - 创建表时可以定义表的结构和行格式(row format),包括字段的分隔符(field terminated by)。 - 分隔符通常根据数据文件的格式来指定,例如使用制表符('\t')。 - 大表、小表和JOIN后表的创建语句类似,但...

    hive函数大全 函数参考

    20. **分割字符串函数** (`split`): 使用分隔符分割字符串。 21. **集合查找函数** (`find_in_set`): 在集合中查找元素的位置。 #### 八、集合统计函数 这些函数用于对数据集进行聚合统计。 1. **个数统计函数** ...

    hive函数大全

    - 字符串连接函数“concat”,带分隔符字符串连接函数“concat_ws”。 - 字符串截取函数“substr”和“substring”。 - 字符串转换大小写函数“upper”、“ucase”和“lower”、“lcase”。 - 去空格函数“trim”,...

    hive函数大全(中文版)

    4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格...

    数据同步Sqoop用法之mysql与Hive导入导出.docx

    该命令将启用一个 MapReduce 任务,将 MySQL 数据库中的数据导入到 Hive 表中,并且指定了 Hive 表的分隔符为\t。 Hive 到 MySQL 的数据导入 Sqoop 也可以将 Hive 表中的数据导入到 MySQL 数据库中。例如,以下...

    hadoophive函数.pdf

    - concat() 和 concat_ws():连接字符串,后者可以指定分隔符。 - substr() 或 substring():截取字符串。 - upper() 和 lower():将字符串转换为大写或小写。 - trim()、ltrim() 和 rtrim():去除字符串的前导...

    Hive SQL 常见函数

    `CONCAT` 用于字符串拼接,而 `SPLIT` 则用于将字符串按照指定的分隔符进行分割。 **语法示例:** ```sql CONCAT(string1, string2, ...) SPLIT(string, delimiter) ``` **应用场景:** 例如,构建新的目录路径: ...

    hive 函数大全

    4. **带分隔符字符串连接函数(concat_ws)** - 示例: `SELECT concat_ws(',', 'Hello', 'World') AS result;` 5. **字符串截取函数(substr, substring)** - 示例: `SELECT substr('Hello', 2, 3) AS result;` 6. **...

    Hive函数大全

    ### Hive函数大全详解 #### 一、关系运算 在Hive中,关系运算是非常基础且重要的部分,用于实现数据的筛选与过滤。 ##### 1. 等值比较(`=`) 等值比较用于判断两个值是否相等。例如: ```sql SELECT * FROM ...

    hue平台oozie工作流操作sqoop,把mysql.pdf

    --fields-terminated-by:字段分隔符。 --hive-import:导入数据到Hive表。 --hive-table:指定Hive表名。 --split-by:用于数据分割的字段名。 -m:Map任务数量。 3. Oozie工作流的创建和配置: 在Hue平台中创建一...

    Hadoop深入浅出之Sqoop介绍.pptx

    这里,`--connect` 指定数据库连接 URL,`--username` 和 `--password` 是数据库认证信息,`--table` 指定要导入的表,`--fields-terminated-by` 设置字段分隔符,`-m 1` 指定使用一个 Map 任务,`--hive-import` ...

Global site tag (gtag.js) - Google Analytics