hive常用文件格式、压缩方式、分割符[202306]
1.文件格式种类
名称 | 详解 | 是否支持spilt |
---|
TextFile | 行式存储,hive数据的默认存储格式,数据可以直接在hdfs上用cat命令查看,支持任意分割符,默认不压缩文件,无法区分数据类型,每个字段都均被认为是文本,可以指定多种压缩方式,所以存储体积大,磁盘开销大 | 不可 |
SequenceFile | 行式存储,一种二进制文件,二进制文件,以<k,v>的方式序列化到文件中,支持多种压缩方式,相同数据体积比textfile要大, | 可 |
RC | 按行分块,每个块按照列存储,有利于压缩和快速的列存取,能够节省存储空间 | 可 |
ORC | 数据按照行分块,每块按照列存储,会基于列创建索引,查询的时候会很快 | 可 |
ParquetFile | 列式存储,文件存储方式为二进制文件link | 可 |
2.文件应用场景
名称 | 应用场景 |
---|
TextFile | 最简单的数据格式,便于和其他工具(Pig,grep,sed,awk)共享数据,便于查看和编辑;加载较快,适合于小型查询,查看具体数据内容的和测试操作。 |
SequenceFile | 可压缩、可分割,优化磁盘利用率和I/O;可并行操作数据,查询效率高,适用于数据量较小,大部分列的查询。 |
RC | 在ORC之前广泛应用的数据格式详解1详解2 |
ORC | 压缩快,快速列存取、是rcfile的改良版本,适用于Hive中大型的存储、查询,不能直接load详解 |
ParquetFile | Parquet能够很好的压缩和编码,有良好的查询性能,支持优先的模式演进,写速度通常比较慢,不支持update、insert,delete、ACID等特性,适用于字段数非常多,无更新、只取部分列的查询。 |
3.常用压缩方式
应用场景
压缩特性运用得当能提高性能,但运用不当也可能降低性能。其基本原则是:
CPU集型的job,少用压缩
IO密集型的job,多用压缩
名称 | 简介 |
---|
Gzip | 压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便。 |
Bzip | 支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便,压缩/解压速度慢;不支持native |
Snappy | 高速压缩速度和合理的压缩率;支持hadoop native库,不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装;linux系统下没有对应的命令。 |
Lzo | 压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;可以在linux系统下安装lzop命令,使用方便。压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式) |
4.文本分割符
详解
5.指定方式
create table test(
man struct<name:string,agt:int> comment "个人信息"
,marry_info map<string,string> comment "婚姻信息"
,hobby array<string> comment "爱好"
)row format delimited
fields terminated by '分割符'
collection items terminated by '分割符'
map keys terminated by '分割符‘
lines terminated by '分割符'
stored as 文件格式
tblproperties("文件格式.compress"="压缩格式");
eg:tblproperties("orc.compress"="snappy")
Hadoop native库(Hadoop本地库)
官方构建
为啥要本地库
IO密集型&CPU密集型
IO密集型:O密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等IO (硬盘/内存) 的读写操作,因此,CPU负载并不高。
密集型的程序一般在达到性能极限时,CPU占用率仍然较低,导致线程空余时间很多,因此IO密集型线程通常为CPU核心数的数倍,其计算公式为:IO密集型核心线程数 = CPU核数 / (1-阻塞系数)。使得线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率。
CPU密集型:CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作CPU读写IO(硬盘/内存)时,IO可以在很短的时间内完成,而CPU还有许多运算要处理,因此,CPU负载很高。
CPU密集表示该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才可能得到加速,而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就只有这么多。通常,CPU密集型线程的数目只需要设置为CPU核心数的线程个数就可以了。