Hive中ORC和TEXTFILE插入数据的方式
Hive中ORC和TEXTFILE插⼊数据的⽅式
最近在⼯作的时候踩坑了,在Hive进⾏数据加⼯的时候按照同事写好的建表语句来造数往⾥插数据。
同事在建表的时候使⽤的stored AS orc;⼀般在⼯程中都是使⽤这种⽅式,有⾼压缩⽐其性能更好。
在本次需求中需要保留⼀部分数据来进⾏测试(这个项⽬是很久之前做的了,之前让优化,优化完毕之后让⾃⼰造数)。
因为添加了⼏个字段,造数的时候需要在结果表中也增加⼏个字段,使⽤的是txt⽂件,这就导致会报错Wrong file format. Please check the file's format。
之前还困惑以为是添加字段时候没有搞好或者怎么样,后来反应过来看了下源码其表的建表使⽤的是orc。在操作的时候将orc改为
textfile(stored AS textfile)就可以正常通过了,虚惊⼀场。
下⾯是textfile和ORC的区别:
引⽤⾃其它博客:
Hive⽂件存储格式(TEXTFILE 、ORC、PARQUET三者的对⽐)
综述:
HIve的⽂件存储格式有四种:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET,前⾯两种是⾏式存储,后⾯两种是列式存储;所谓的存储格式就是在Hive建表的时候指定的将表中的数据按照什么样⼦的存储⽅式,如果指定了A⽅式,那么在向表中插⼊数据的时候,将会使⽤该⽅式向HDFS中添加相应的数据类型。
如果为textfile的⽂件格式,直接load就OK,不需要⾛MapReduce;如果是其他的类型就需要⾛MapReduce了,因为其他的类型都涉及到了⽂件的压缩,这需要借助MapReduce的压缩⽅式来实现。
总结:
⽐对三种主流的⽂件存储格式TEXTFILE 、ORC、PARQUET
压缩⽐:ORC >  Parquet >  textFile(textfile没有进⾏压缩)
查询速度:三者⼏乎⼀致
案例证明:
1,textfile,创建表,存储数据格式为TEXTFILE
create table log_text (
track_time string,
url string,
session_id string,
清明节的作文400字左右
月亮的诗句古诗referer string,新的一天新的开始
ip string,
211大学全部名单排end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as textfile ;
向表中加载数据
load data local inpath '/opt/module/datas/log.data' into table log_text ;
查看表中数据⼤⼩
这个过程不会⾛MapReduce,⽽是直接将⽂件上传到了HDFS,在HDFS上⽂件的名字还叫log.data
dfs -du -h /user/hive/warehouse/db_hive.db/log_text;
18.1 M  /user/hive/warehouse/db_hive.db/log_text/log.data
2,ORC,创建表,存储数据格式为ORC
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as orc ;
向表中加载数据
insert into table log_orc select * from log_text ;
查看表中数据⼤⼩
这个过程要⾛MapReduce,⽽且⽂件是按照列式存储的,还会对⽂件进⾏压缩,Orc默认使⽤的压缩⽅式是
zlib因此会更加节省空间,hadfs上是新的⽂件名,
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M  /user/hive/warehouse/db_hive.db/log_orc/000000_0
3,Parquet,创建表,存储数据格式为parquet
create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as parquet ;工商管理专业就业前景
向表中加载数据
insert into table log_parquet select * from log_text ;
查看表中数据⼤⼩这个过程要⾛MapReduce,⽽且⽂件是按照列式存储的,因此会更加节省空间,
hadfs上是新的⽂件名,
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_parquet;
13.1 M  /user/hive/warehouse/db_hive.db/log_parquet/000000_0
存储⽂件的压缩⽐总结:
ORC >  Parquet >  textFile
select count(*) from log_text;
select count(*) from log_orc;
select count(*) from log_parquet;
存储⽂件的查询速度总结:查询速度相近。
压缩和存储的结合:
在建表的时候,如果我们指定了列式存储的⽅式,他会默认使⽤对于的压缩⽅式将我们的数据进⾏压缩,与此同时我们能够⾃⼰定制在⽂件存储的时候使⽤什么样⼦的压缩⽅式,例⼦如下:
2010年12月思想汇报

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。