当前位置: 首页>数据库>正文

hive 主机创建文件目录 hive建表指定文件格式

经过上一篇对压缩的了解后,今天我们来对hive上面的文件存储进行一次了解。此前,我们已经使用过hive来构建表格,hive上的逻辑表上的数据都是存储在HDFS上面的,但是我们一直所存储的文件都是文本文件。但是,在hive上的表格每一个字段都可能是不同类型的数据结构,这样我们就面临着需要对HDFS上的数据文件进行解析的过程。那么不同的存粗文件格式也将有不一样的效果的。

首先,我们先来了解下hive上是怎么设定文件的存储格式的:create table tab_name (id int,name string,....) row format delimited fields terminated by '\t';  这是正常的创建表格的数据。而定义文件格式是在这句话后面加上stored as file_format

这样这个表背后的数据文件将是以文本格式存储在HDFS上的,同时在你导入数据的时候,数据文件也将是一个文本格式的。load data [local] inpath '....' overwrite into table tab_name; 这个时候导入的数据文件要和你创建表格是设定的文件格式一致,所以我们在生产上是很少使用load这样来导入数据的,一般都是构建一个中间临时表(这个表是以文本格式存储的),然后我们再通过insert into来基于不同的存储格式来构建其他的表。

那么stored as file_format中的file_format都有些什么呢?我们从官网上可以查阅得到:https://cwiki.apache.org/confluence/display/Hive

其中有:TextFile,SequenceFile,RCFile,ORCFile,Parquet等。而生产上面我们都是使用ORCFile,Parquet这两种的。

TextFile:文本格式,这个是hive上的默认设置,如果你没有使用stored as来指定一种存储格式的话就默认是文本格式了。

SequenceFile:这个是将文件存储成序列化文件,它的底层是以key-value键值对的方式存储的,将构建record_length,key_length,key,record/compress_record,就是如果这是一个压缩的文件的话,其只对value进行压缩嘛。从这里我们也可以得出,这个文件还为每一条记录添加了一些信息进去(查询的时候可能会快一点吧),这中存储格式比文本格式存储量更大的。

RCFile:这个存储格式有点特别,它将原来一行记录竖着存储了,这样原来的一行编程了一列。相当于我们线性代数里面的转置嘛,经测试效果也是一般的。

ORCFile:这是一个生产上常用的存储格式且这种存储格式可以极大的减少文件的大小,这里有一篇文章供阅读:

https://hortonworks.com/blog/orcfile-in-hdp-2-better-compression-better-performance/

同时,这种存储格式会为每10000行数据构建一个index,在查询的过程中是先查询这个index在到真实的物理文件中去找的。如果在hive上对ORCFile的文件进行压缩的话,默认是使用ZLIB这种格式的。

Parquet:这也是常用的一种存储文件的格式,但效果是没有ORCFile好的,连接里的那篇文章也表示了。

了解了上面这些存储格式以后,我们来说一下行式存储和列式存储。

行式存储:每行的数据都是完整的,对于一个表格来说,就是按照表格的id进行切分成不同的数据块来存储,每一次读取数据的时候都需要将整条记录加载下来(就是所有的列都读取,所谓的全量读取呗),如果你是使用select * from tab_name where ...这种方式的来查阅表格的话,行式存储执行效率会高一点。

列式存储:就是按照列或者字段来进行分块存储,不同的列在不同的文件当中,如果你是查询某些列的时候,就不需要全量读取了。要哪个字段就加载哪个字段的文件,更重要的是因为不同的字段有不同的数据类型,可以使用不同的压缩方式,这样解析起来效果更好了。所以生产当中90%都是列式存储的,知名的有Hbase这个数据库嘛。

 


https://www.xamrdz.com/database/6e31951378.html

相关文章: