一、Hive中排序的种类和适用场景
1.1、order by 全局排序
- 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序),所以当输入的数据规模较大时,会导致计算的时间较长
- 与数据库中 order by的区别在于在 hive 的严格模式下(hive.mapred.mode = strict)下,必须指定 limit ,否则执行会报错!
1.2、sort by 每个MapReduce排序
- 不是全局排序,其在数据进入reducer前完成排序,单个有序。
- sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序
- 不受 hive.mapred.mode 是否为strict ,nostrict 的影响,使用sort by 你可以指定执行的reduce 个数 (set mapred.reduce.tasks=)
1.3、distribute by 每个分区排序:
- 按照指定的字段对数据进行划分输出到不同的reduce中。
- distribute by类似 MR 中 partition(自定义分区),进行分区,某个特定行应该到哪个 reducer ,通常是为了进行后续的聚集操作
- distribute by + sort by:
- 分桶,保证同一字段值只存在一个结果文件当中,结合 sort by 保证 每个 reduceTask 结果有序
- distribute by 和 sort by 的常见使用场景有:
- Map输出的文件大小不均
- Reduce输出文件不均
- 小文件过多
- 文件超大
1.4 、cluster by
- 对同一字段分桶并排序,不能和 sort by 连用,除了具有 distribute by 的功能外还兼具 sort by 的功能。
- 但是排序只能是 升序 排序,不能像distribute by 一样去指定排序的规则为 ASC 或者 DESC 。
二、Hive的几种存储方式
- 行式存储:TextFile、SequenceFile
- 列式存储:ORC、Parquet
Text File format : 默认格式,数据不做压缩,磁盘开销大,数据解析开销大。压缩后的文件不支持split,Hive不会对数据进行切分
Sequence File format
- SequenceFile 是 Hadoop API 提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点
- SequenceFile 支持三种压缩选择:NONE, RECORD, BLOCK。 Record 压缩率低,一般建议使用 BLOCK 压缩。
Parquet :
- 列式数据存储。 查询比较快
- Parquet支持嵌套的数据模型,每一个数据模型的schema包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名
- 二进制方式存储的,是不可以直接读取和修改的。
ORC :
- ORC 将行的集合存储在一个文件中,并且集合内的行数据将以列式存储。采用列式格式,压缩非常容易,从而降低了大量的存储成本。
- 当查询时,会查询特定列而不是查询整行,因为记录是以列式存储的。
- ORC 会基于列创建索引,当查询的时候会很快。
- ORC文件也是以二进制方式存储的,所以是不可以直接读
三、Hive调优问题(包括数据倾斜和小文件等问题)
参考:
Hive调优及优化(包含数据倾斜和小文件问题)_李大寶的博客-CSDN博客
四、数仓常见问题
参考:
数据仓库中基本概念_李大寶的博客-CSDN博客
五、Hive表的概念
参考:hive中内部表、外部表、分区表、桶表、拉链表_李大寶的博客-CSDN博客_hive 查看表类型