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
分享到:
相关推荐
文档编写目的 Hive在0.14及以后版本支持字段的多分隔符,参考: ... 而Fayson在以前的文章中也基于C5...如何将多个字符作为字段分割符的数据文件加载到Hive表中,示例数据如下: 字段分隔符为“@#$” test1@#$test1name@#$t
实验中创建了一个名为`stocks`的内部表,字段分隔符为英文逗号。表结构包括`exchange`、`symbol`、`ymd`、`price_open`、`price_high`、`price_low`、`price_close`、`volume`和`price_adj_close`等字段,数据类型...
- **处理边界情况**:如果找不到更多的分隔符,则默认将`@location`设置为字符串的长度加1,以便正确截取出最后一个子字符串。 - **返回子字符串**:利用`SUBSTRING`函数根据`@start`和`@location`的值截取第n个子...
这在创建`noLocation_hyy_db`的内部表`hero_archer`时可以观察到,表结构中未指定数据文件位置,数据将按Hive默认分隔符`\t`进行解析。外部表则不同,它们只记录数据的元信息,数据本身不受表的生命周期管理。创建`...
上述两种特殊情况会导致数据加载到Hive表时发生错位,因为Hive默认不支持多字节分隔符,并且无法正确处理字段内包含分隔符的情况。 ### 2.3 解决方案一:替换分隔符 针对情况一,可以编写程序(如MapReduce作业)在...
字符串函数包含了一系列处理文本数据的函数,比如字符ascii码函数(ascii),base64字符串编码解码函数,字符串连接函数(concat)和带分隔符字符串连接函数(concat_ws)等。 concat_ws是一个特别实用的函数,它用于将多...
`serialization.format`参数通常用来指定JSON对象的键值对分隔符,这里设置为1表示使用冒号(:)作为分隔符。 集成JSON-Serde后,我们可以直接用HQL对JSON数据进行复杂的查询和分析,这极大地扩展了Hive在大数据...
语句指定了表的行格式和分隔符。 四、HiveSQL Load Data 语句 HiveSQL 的 Load Data 语句用于将数据从文件加载到表中。下面是一个示例: load data local inpath '/export/data/hivedatas/student.csv' into ...
- **数据存储**:Hive中的数据以文件形式存储在HDFS中,每条记录对应文件中的一行,字段之间通过指定的分隔符进行分割。 - **权限管理**:Hive的权限控制主要基于文件级别,即用户的访问权限取决于他们对文件系统的...
- **分区**(Partition):Hive允许根据某个列的值将表中的数据划分到多个独立的目录中。这种机制对于提高查询性能非常有效,特别是当数据量巨大时。 - **桶**(Bucket):通过将数据分成较小的部分(桶),Hive可以...
为了更精确地控制数据格式,可以通过添加更多的参数来指定字段之间的分隔符等细节。 ```bash sqoop import --connect jdbc:oracle:thin:@192.168.91.4:1521:ORCL --username JIAOTONG --password dsjyjy123456 --...
SPLIT 函数用于将一个字符串按照指定的分隔符拆分成多个子字符串。语法为:`SPLIT(str, delimiter)` 其中,`str` 是要拆分的字符串,`delimiter` 是分隔符。例如: ```sql SELECT SPLIT('apple,banana,orange', ',...
然后,使用`CREATE TABLE`语句定义Hive表结构,指定字段名、字段类型以及分隔符。 2. **数据预处理**:由于数据可能存在缺失值、异常值或不一致的格式,预处理阶段是必要的。这可能包括数据清洗、填充缺失值、转换...
- **字段分隔符**: 定义字段和记录之间的分隔符。 - **HiveSQL转换为MapReduce过程**: - 解释器将HiveSQL转换为逻辑计划。 - 编译器将逻辑计划转换为物理计划。 - 优化器对物理计划进行优化。 - 执行器根据优化...
- **ROW FORMAT**:指定行格式,如列分隔符等。 - **STORED AS**:指定存储格式,如TextFile、SequenceFile等。 - **LOCATION**:指定HDFS上的物理存储路径。通常用于外部表。 示例:创建一个简单的表 ```sql ...
要在 Hive 中存储和处理不完全 JSON 格式的数据,需要使用 delimiter 分隔符来分隔字段。例如: ``` Create [external] table test(id string,json string) row format delimited fields terminated by '|' Stored ...
在创建Hive表时,我们需要指定文件的分隔符,因为数据通常是以特定字符(如制表符或逗号)分隔的。例如,创建`video_info`表的HQL语句可能如下: ```sql CREATE TABLE video_info ( video_id STRING, title ...
也可以自定义输出格式,如使用制表符作为分隔符: ```sql hive (hive)> insert overwrite local directory '/home/hadoop/export_hive' > row format delimited fields terminated by '\t' > collection items ...
4. **带分隔符字符串连接函数** (`concat_ws`): 带分隔符地连接多个字符串。 5. **字符串截取函数** (`substr`, `substring`): 截取字符串的一部分。 6. **字符串转大写函数** (`upper`, `ucase`): 将字符串转换为...
例如,创建一个名为`user_info`的内部表,其包含了用户的基本信息字段,并且指定了字段和集合的分隔符。 通过Hive提供的SQL-like语言,用户可以进行数据的查询、更新、插入和删除等操作,以及执行复杂的数据分析...