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多字节分隔符解决方案.docx
hive默认的字符间分隔符SOH(‘/001’),如果不指定正确的分隔符,数据文件就无法被正确映射. 内部表(托管表):删除表时,数据文件将被删除。 外部表:创建表时,加上external,表示创建的为外部表。删除表时,...
文档编写目的 Hive在0.14及以后版本支持字段的多分隔符,参考: ... 而Fayson在以前的文章中也基于C5...如何将多个字符作为字段分割符的数据文件加载到Hive表中,示例数据如下: 字段分隔符为“@#$” test1@#$test1name@#$t
“大数据技术原理与应用”课程实验报告 题目:实验六:熟悉Hive的基本操作 姓名:小猪猪 日期:2022/5/15 1、实验环境: ...1.创建一个内部表 stocks,字段分隔符为英文逗号,表结构如下所示: stocks 表结构:
hive 创建表语法使用等
Hive表生成工具,Hive表生成工具Hive表生成工具
支持hive 源数据、表结构导出
SparkSQL通过Hive创建DataFrame问题分析 问题一 Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'stu' not found in database 'default'; 分析:确实没有临时表View,...
aaa,bbb,ccc n=2时 截取结果 bbb 很明白了吧 哈
Hive表分区,里面有比较详细的Hive表分区方法,希望能够有所帮助。
4.1.1使用LIKE关键字创建一个与已有表模式相同的新表: 4 4.2 Hive 修改表 4 4.2.1 Hive 新增一个字段: 4 4.2.2 Hive 修改字段名/字段类型/字段位置/字段注释: 4 4.2.3 Hive 重命名表名: 4 4.3Hive 删除表: 4 5 ...
NULL 博文链接:https://913.iteye.com/blog/2039455
hive表修改分区数据
背景:由于Hive需要开启权限管理,安装网上教程,开启权限配置,重启集群后。 使用root用户登录,进入Hive命令行界面。 执行 create database test; 发现报错: Authorization failed:No privilege 'Create' found ...
Hive内部表合并小文件Java程序
hive的表数据,可以到我的博客,有建表语句,我的链接是 https://blog.csdn.net/qq_43662627/article/details/121033176
通过shell脚本,批量把一个库下面的表结构全部导出,在开发环境执行过。
1.可根据数据库表名批量删除; 2.封装了自定义方法,可根据表明中任意一字段(或多个字段)作为key批量删除 3.解决了权限不足等问题造成的删表不彻底等问题 4.程序为java编写
2. 以上简单创建了一个DB库,但是这条HQL可以更进一步的优化,我们可以加上if not exists 3. 查看数据仓库DB的信息及路径 4. 删除名为DB