通过创建分区表,数据存储在 HDFS 上的单独文件夹中。
Hive 将查询分区数据集,而不是 全表扫描。
创建表时通过PARTITIONED BY指定分区字段
insert时Partition指定分区字段导入
从临时表导入数据到分区表时启用动态分区
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
ORC的全称是(Optimized Row Columnar),它通过predicate push-down, compression等技术来提高查询速度。ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Spark SQL、Presto等查询引擎支持,但是Impala对于ORC目前没有支持,仍然使用Parquet作为主要的列式存储格式。2015年ORC项目被Apache项目基金会提升为Apache顶级项目。ORC具有以下一些优势:
- ORC是列式存储,有多种文件压缩方式,并且有着很高的压缩比。
- 文件是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅节省HDFS存储资源,查询任务的输入数据量减少,使用的MapTask也就减少了。
- 提供了多种索引,row group index、bloom filter index。
- ORC可以支持复杂的数据结构(比如Map等)
- ORC 支持压缩存储(使用 ZLIB 或如上所示使用 SNAPPY),但也支持不压缩存储。
在建表语句后指定[kbd]STORED AS ORC tblproperties (“orc.compress" = “SNAPPY”)[/kbd]即可,示例中指定SNAPPY压缩
分桶字段必须出现在表已有的字段内。
分桶逻辑:对分桶字段取哈希,用这个哈希值与桶的数量取余,余几,这个数据就放在哪个桶内。
作用:提高join效率和用于数据取样。
提高join效率:将join关联的字段作为分桶字段。相同的数据汇入到一个桶内,在join时直接读取桶内的所有数据,不用全表扫描。
数据取样:将数据编号作为分桶字段,与分桶数量取余。这样可以讲数据打散,分到不同的桶内。那么每个桶内的数据包含各个“阶段”的数据。
1、开启分桶功能
set hive.enforce.bucketing=true;
2、设置桶的数量
set mapreduce.job.reduces=3;
3、创建分桶表
create table course
(
c_id string,
c_name string,
t_id string
) clustered by (c_id) into 3 buckets row format delimited fields terminated by '\t';
Apache Tez Engine是一个可扩展的框架,用于构建高性能批处理和交互式数据处理。它由YARN在Hadoop中 调度。Tez通过提高处理速度和保持MapReduce扩展到数PB数据的能力来改进MapReduce job。
通过设置hive.execution.engine 为tez:可以在环境中启用Tez引擎:
set hive.execution.engine=tez;
向量化通过在单个操作中获取 1024 行而不是 每次只获取单行来改善 scans, aggregations, filters 和 join 这类操作的性能。
我们可以通过执行以下命令在环境中启用向量化:
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;
文章评论