`
superlxw1234
  • 浏览: 551374 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44446
社区版块
存档分类
最新评论

hive创建表指定分隔符,不支持多个字符作为分隔符

    博客分类:
  • hive
阅读更多

hadoop fs -cat /tmp/liuxiaowen/1.txt

 

000377201207221125^^APPLE IPHONE 4S^^2
132288201210331629^^THINKING IN JAVA^^1
132288201210331629^^THIN ssss^^1111
132288201210331629^^THdd dd ddJAVA^^10

 

文本文件以两个尖角符作为列分隔符

 

hive中建表:

 

create external table tt(times string,
product_name string,
sale_num string
) row format delimited
fields terminated by '^^'
STORED AS TEXTFILE 
location 'hdfs://nn/tmp/liuxiaowen/';

 

hive> select times from tt;

000377201207221125
132288201210331629
132288201210331629
132288201210331629


hive> select product_name from tt; (结果均为空字符)
OK




Time taken: 13.498 seconds

hive> select sale_num from tt;
APPLE IPHONE 4S
THINKING IN JAVA
THIN ssss
THdd dd ddJAVA
 

本来应该放在product_name中的值,被分到了第三个字段sale_num.

 

原因是,hive中create table时候指定列分隔符,只能用一个字符,上面的建表语句真实采用的分隔符为一个尖角符^,

所以,真正的是将数据000377201207221125^^APPLE IPHONE 4S

以^为分隔符,分到了三个字段中,所以才有上面的select结果。

 

解决办法:

1. 将源文件中的分隔符替换为一个字符,比如\001(Ctrl+A),创建表时候指定\001作为分隔符;

 

2. 自定义 outputformat 和 inputformat。

 

Hive 的 outputformat/inputformat 与 hadoop 的 outputformat/inputformat 相当类似, inputformat 负责把输入数据进行格式化,然后提供给 Hive , outputformat 负责把 Hive 输出的数据重新格式化成目标格式再输出到文件,这种对格式进行定制的方式较为底层,对其进行定制也相对简单,重写 InputFormat 中 RecordReader 类中的 next 方法即可。

示例代码如下:

public boolean next(LongWritable key, BytesWritable value) throws IOException {
        while (reader.next(key,text)) {
	        String strReplace = text .toString().toLowerCase().replace( "^^" , "\001" );
	        Text txtReplace = new Text();
	        txtReplace.set(strReplace );
	        value.set(txtReplace.getBytes(), 0, txtReplace.getLength());
	        return true ;
      	}
      return false ;
}

 重写 Hive IgnoreKeyTextOutputFormat 中 RecordWriter 中的 write 方法,示例代码如下:

public void write (Writable w) throws IOException {
      String strReplace = ((Text)w).toString().replace( "\001" , "^^" );
      Text txtReplace = new Text();
      txtReplace.set(strReplace);
      byte [] output = txtReplace.getBytes();
      bytesWritable .set(output, 0, output. length );
      writer .write( bytesWritable );
}
 

自定义 outputformat/inputformat 后,在建表时需要指定 outputformat/inputformat ,如下示例:

stored as INPUTFORMAT 'com.aspire.search.loganalysis.Hive .SearchLogInputFormat' OUTPUTFORMAT 'com.aspire.search.loganalysis.Hive .SearchLogOutputFormat'

 

3. 通过 SerDe(serialize/deserialize) ,在数据序列化和反序列化时格式化数据。

这种方式稍微复杂一点,对数据的控制能力也要弱一些,它使用正则表达式来匹配和处理数据,性能也会有所影响。但它的优点是可以自定义表属性信息 SERDEPROPERTIES ,在 SerDe 中通过这些属性信息可以有更多的定制行为。

 

add jar /opt/app/hive-0.7.0-rc1/lib/hive-contrib-0.7.0.jar ;

create external table tt(times string,
product_name string,
sale_num 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 
location 'hdfs://nn/tmp/liuxiaowen/';

hive> select product_name from tt;

APPLE IPHONE 4S
THINKING IN JAVA
THIN ssss
THdd dd ddJAVA

hive> select times,sale_num from tt;

000377201207221125      2
132288201210331629      1
132288201210331629      1111
132288201210331629      10
 

 

0
0
分享到:
评论
1 楼 top_cai 2013-09-27  
请问有没有具体代码啊,这个 while (reader.next(key,text))  是什么意思啊?,没有reader /text的变量的?

相关推荐

    0738-6.2.0-如何在Hive中使用多分隔符

    文档编写目的 Hive在0.14及以后版本支持字段的多分隔符,参考: ... 而Fayson在以前的文章中也基于C5...如何将多个字符作为字段分割符的数据文件加载到Hive表中,示例数据如下: 字段分隔符为“@#$” test1@#$test1name@#$t

    大数据实验六实验报告:熟悉Hive的基本操作

    实验中创建了一个名为`stocks`的内部表,字段分隔符为英文逗号。表结构包括`exchange`、`symbol`、`ymd`、`price_open`、`price_high`、`price_low`、`price_close`、`volume`和`price_adj_close`等字段,数据类型...

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

    - **处理边界情况**:如果找不到更多的分隔符,则默认将`@location`设置为字符串的长度加1,以便正确截取出最后一个子字符串。 - **返回子字符串**:利用`SUBSTRING`函数根据`@start`和`@location`的值截取第n个子...

    HIVE创建库创建表.docx

    这在创建`noLocation_hyy_db`的内部表`hero_archer`时可以观察到,表结构中未指定数据文件位置,数据将按Hive默认分隔符`\t`进行解析。外部表则不同,它们只记录数据的元信息,数据本身不受表的生命周期管理。创建`...

    第5章:Hive函数重要应用案例1

    上述两种特殊情况会导致数据加载到Hive表时发生错位,因为Hive默认不支持多字节分隔符,并且无法正确处理字段内包含分隔符的情况。 ### 2.3 解决方案一:替换分隔符 针对情况一,可以编写程序(如MapReduce作业)在...

    hive函数大全

    字符串函数包含了一系列处理文本数据的函数,比如字符ascii码函数(ascii),base64字符串编码解码函数,字符串连接函数(concat)和带分隔符字符串连接函数(concat_ws)等。 concat_ws是一个特别实用的函数,它用于将多...

    Hive-JSON-Serde-1.3.8.zip

    `serialization.format`参数通常用来指定JSON对象的键值对分隔符,这里设置为1表示使用冒号(:)作为分隔符。 集成JSON-Serde后,我们可以直接用HQL对JSON数据进行复杂的查询和分析,这极大地扩展了Hive在大数据...

    HiveSQL实战题目.docx

    语句指定了表的行格式和分隔符。 四、HiveSQL Load Data 语句 HiveSQL 的 Load Data 语句用于将数据从文件加载到表中。下面是一个示例: load data local inpath '/export/data/hivedatas/student.csv' into ...

    hive入门.pdf

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

    hive原理1介绍

    - **分区**(Partition):Hive允许根据某个列的值将表中的数据划分到多个独立的目录中。这种机制对于提高查询性能非常有效,特别是当数据量巨大时。 - **桶**(Bucket):通过将数据分成较小的部分(桶),Hive可以...

    Sqoop导Oracle数据到Hive

    为了更精确地控制数据格式,可以通过添加更多的参数来指定字段之间的分隔符等细节。 ```bash sqoop import --connect jdbc:oracle:thin:@192.168.91.4:1521:ORCL --username JIAOTONG --password dsjyjy123456 --...

    hive sql 拆解字段.docx

    SPLIT 函数用于将一个字符串按照指定的分隔符拆分成多个子字符串。语法为:`SPLIT(str, delimiter)` 其中,`str` 是要拆分的字符串,`delimiter` 是分隔符。例如: ```sql SELECT SPLIT('apple,banana,orange', ',...

    大数据Hive测试数据uaction.rar

    然后,使用`CREATE TABLE`语句定义Hive表结构,指定字段名、字段类型以及分隔符。 2. **数据预处理**:由于数据可能存在缺失值、异常值或不一致的格式,预处理阶段是必要的。这可能包括数据清洗、填充缺失值、转换...

    Hive教程.pdf

    - **字段分隔符**: 定义字段和记录之间的分隔符。 - **HiveSQL转换为MapReduce过程**: - 解释器将HiveSQL转换为逻辑计划。 - 编译器将逻辑计划转换为物理计划。 - 优化器对物理计划进行优化。 - 执行器根据优化...

    Hive语法详解

    - **ROW FORMAT**:指定行格式,如列分隔符等。 - **STORED AS**:指定存储格式,如TextFile、SequenceFile等。 - **LOCATION**:指定HDFS上的物理存储路径。通常用于外部表。 示例:创建一个简单的表 ```sql ...

    hive支持json格式的数据.docx

    要在 Hive 中存储和处理不完全 JSON 格式的数据,需要使用 delimiter 分隔符来分隔字段。例如: ``` Create [external] table test(id string,json string) row format delimited fields terminated by '|' Stored ...

    hive相关练习的数据data.rar

    在创建Hive表时,我们需要指定文件的分隔符,因为数据通常是以特定字符(如制表符或逗号)分隔的。例如,创建`video_info`表的HQL语句可能如下: ```sql CREATE TABLE video_info ( video_id STRING, title ...

    oracle,teradata,hive,gbase,db2数据库导出csv命令总结

    也可以自定义输出格式,如使用制表符作为分隔符: ```sql hive (hive)> insert overwrite local directory '/home/hadoop/export_hive' > row format delimited fields terminated by '\t' > collection items ...

    hive函数大全 函数参考

    4. **带分隔符字符串连接函数** (`concat_ws`): 带分隔符地连接多个字符串。 5. **字符串截取函数** (`substr`, `substring`): 截取字符串的一部分。 6. **字符串转大写函数** (`upper`, `ucase`): 将字符串转换为...

    大数据平台和HiveSQL.md

    例如,创建一个名为`user_info`的内部表,其包含了用户的基本信息字段,并且指定了字段和集合的分隔符。 通过Hive提供的SQL-like语言,用户可以进行数据的查询、更新、插入和删除等操作,以及执行复杂的数据分析...

Global site tag (gtag.js) - Google Analytics