解决hive中导入text文件遇到的坑


Posted in Python onApril 07, 2021

今天帮一同学导入一个excel数据,我把excel保存为txt格式,然后建表导入,失败!分隔符格式不匹配,无法导入!!!!怎么看两边都是\t,怎么不匹配呢?

做为程序员,最不怕的就是失败,因为我们有一颗勇敢的心!再来!又特么失败。。。

想了好久,看看了看我的表格式,我犯了一个好低级的错误:

hive表的存储格式设置为了orcfile!!!

众所周知:orcfile为压缩格式,可以节约大量存储空间,但orc还有个特点就是不能直接load数据!要想load数据,我们要建一个存储格式为textfile的中间表,然后再把数据抽取过去。因为这个错误太简单,网上有相关科普,因此很少有把它当错误写出来。遇到问题的朋友们可能要走些弯路,我来补个漏~~~~~~

举个栗子:

1.首先,导出excel表格为txt格式,(这个过程不再赘述,网上教程一大把)。

123,小明,666,1990-09-23 12:00:18
256,小伙,555,1989-10-06 03:57:32
142,小兰,444,1992-07-04 05:05:45

2.在hive中创建表模型:

CREATE TABLE IF NOT EXISTS STUDENTS
(
ID INT COMMENT'学生',
SNAME STRING COMMENT '姓名',
SCORE INT COMMENT '得分',
STIME STRING COMMENT '考试时间'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORCFILE;

3.创建临时表(中间表):

CREATE TABLE IF NOT EXISTS STUDENTS_TMP
(
ID INT COMMENT'学生',
SNAME STRING COMMENT '姓名',
SCORE INT COMMENT '得分',
STIME STRING COMMENT '考试时间'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

与目标表只有名称和存储格式不同,其他都相同。

4.load 数据到临时表:

load data local inpath '/export/data/1.txt' into table students_tmp;

5.将数据导入目标表:

insert overwrite table students select * from students_tmp;

6.然后查看表数据,大功造成:

hive > select * from students;
OK
123 小明 666 1990-09-23 12:00:18
256 小伙 555 1989-10-06 03:57:32
142 小兰 444 1992-07-04 05:05:45
Time taken: 0.26 seconds, Fetched: 3 row(s)

其他存储格式如 SEQUENCEFILE、PARQUET 等,也要选存储为textfile格式,然后抽入目标表。

一定要按照导出格式的分隔符建表,不然load数据必然出错或全是null;

excel导出格式:

格式 分隔符 中文名称
text \t  制表符
csv , 逗号

7.还要注意一点是我们从excel导出的文件格式是UTF-8 (无论是txt还是csv都是这个格式,都需要转码),我们需要把它转成utf-8才能Load。

所以在load之前,我们一般会采取两种办法:

1. 在文本编辑器中进行转码,带不带bom关系不大,然后上传;

2.在文件所在本地目录下执行以下命令转码:

piconv -f UTF-8 -t UTF-8 1.txt > 2.txt

注意,在本地目录下命令转码会改变文件名,因为此命令会把所文件写入到另一个文件,并清空原文件内容,如果我们不改名,文件内容会完全丢失。所以,我们Load的时候一定要选择修改后的文件名哦。

示例:

转码前数据:

hive> select * from students;
OK
112	��	35	2017/8/19 15:30
113	����	45	
114	³��	55	2017/8/21 15:30
115	����	NULL	
116	������	75	2017/8/23 15:30
117	������	85	2017/8/24 15:30
118	�˽�	NULL	2017/8/25 15:30
119	������	90	
120	СѾ	NULL	2017/8/27 15:30
121	����	80	2017/8/28 15:30
122	��߸	75	
123	��«��	70	2017/8/30 15:30
124	����	NULL	2017/8/31 15:30
125	�?	NULL	
126	�峤	NULL	2017/9/2 15:30
127	˾��	50	2017/9/3 15:30
128	������	58	2017/9/4 15:30
129	����	66	2017/9/5 15:30
Time taken: 0.134 seconds, Fetched: 18 row(s)

去所在目录下转码,再Load

piconv -f UTF-8 -t UTF-8 2.csv > 3.csv
# 在hive中选择正确的文件Load:
hive> load data local inpath '/export/data/3.csv' into table students;

结果:

hive> select * from students;
OK
112	小宝	35	2017/8/19 15:30
113	王明	45	
114	鲁班	55	2017/8/21 15:30
115	苗苗	NULL	
116	少林寺	75	2017/8/23 15:30
117	体育界	85	2017/8/24 15:30
118	八戒	NULL	2017/8/25 15:30
119	周芷若	90	
120	小丫	NULL	2017/8/27 15:30
121	海宝	80	2017/8/28 15:30
122	哪吒	75	
123	葫芦娃	70	2017/8/30 15:30
124	丹枫	NULL	2017/8/31 15:30
125	电工	NULL	
126	村长	NULL	2017/9/2 15:30
127	司机	50	2017/9/3 15:30
128	王世间	58	2017/9/4 15:30
129	松鼠	66	2017/9/5 15:30
Time taken: 0.106 seconds, Fetched: 18 row(s)

补充:hive导入数据出现NULL

在把hdfs上数据迁移到hive中的表时,若出现数据位NULL,是因为没有指定列分隔符。

由于hive默认的分隔符是/u0001(Ctrl+A),为了平滑迁移,需要在创建表格时指定数据的分割符号,语法如下:

hive (default)> create external table et (time BIGINT, userid string, content string, urlrank int, urlnum int, url string)
  > partitioned by (filenum int) 
  > row format delimited fields terminated by '\t';

上面创建的是外部表,“导入”数据时可以用load,但若不想进行移动数据,就用命令alter来进行指向:

alter table et add partition (filenum=1) location '/input/SogouQueryLog/file1';

注意location后面跟的地址必须是个目录,若不是,可以用hdfs fs -mv src dest 进行移动数据:

hadoop fs -mv /input/SogouQueryLog/querylog_1 /input/SogouQueryLog/file1

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python中除法使用的注意事项
Aug 21 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
Python实现分段线性插值
Dec 17 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
python如何使用代码运行助手
Jul 03 Python
Python远程方法调用实现过程解析
Jul 28 Python
python之语音识别speech模块
Sep 09 Python
python设置中文界面实例方法
Oct 27 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 Python
python - asyncio异步编程
Apr 06 #Python
python - timeit 时间模块
Apr 06 #Python
python制作图形界面的2048游戏, 基于tkinter
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 #Python
python删除csv文件的行列
Apr 06 #Python
python使用pygame创建精灵Sprite
python 逐步回归算法
You might like
Yii框架关联查询with用法分析
2014/12/02 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
php的socket编程详解
2016/11/20 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
JS实现多选框的操作
2020/06/24 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python tqdm库的使用
2020/11/30 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
银行门卫岗位职责
2013/12/29 职场文书
会计员岗位职责
2014/03/15 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
体检通知范文
2015/04/21 职场文书