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,
referer string,
ip string,
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;
 
存储文件的查询速度总结:查询速度相近。
压缩和存储的结合:
在建表的时候,如果我们指定了列式存储的方式,他会默认使用对于的压缩方式将我们的数据进行压缩,与此同时我们能够自己定制在文件存储的时候使用什么样子的压缩方式,例子如下:

1.创建一个非压缩的的ORC存储方式
create table log_orc_none(
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 tblproperties ("orc.compress"="NONE");
插入数据
hive (default)> insert into table log_orc_none select * from log_text ;
 
2.创建一个SNAPPY压缩的ORC存储方式
create table log_orc_snappy(
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 tblproperties ("orc.compress"="SNAPPY");
插入数据
hive (default)> insert into table log_orc_snappy select * from log_text ;
 
3.创建一个默认压缩的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 ;
 
对比三者的压缩比:
 
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_none;
18.1 M  /user/hive/warehouse/db_hive.db/log_orc_none/log.data
 
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_snappy;
3.8 M  /user/hive/warehouse/db_hive.db/log_orc_snappy/000000_0
 
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
 
总结:
没有压缩的orc格式相当于textfile,默认的压缩格式压缩比最大,snappy对数据进行了压缩
orc存储文件默认采用ZLIB压缩,ZLIB采用的是deflate压缩算法。因此比snappy压缩的小。
文件没有压缩的话,HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名
总结:
比对三种主流的文件存储格式TEXTFILE 、ORC、PARQUET
 
压缩比:ORC >  Parquet >  textFile(textfile没有进行压缩)
 
查询速度:三者几乎一致
 
HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名
 
————————————————
版权声明:本文为CSDN博主「夜古诚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jerry_991/article/details/88924321

posted on 2021-08-30 15:01  桌子哥  阅读(771)  评论(0编辑  收藏  举报