hive最快的执行就是不走MapReduce。简单的select的是最快的,嵌套啥的都比较忙。与关系型数据库不同。
在做之前要将所写的查询语句进行格式化输入,然后再运行。
在写sql语句的时候,要注意一下几点:
1、尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
先把所要的条数选出来,然后再在所选出来的数据上进行操作。
要做表连接的时候先将每个表所要的东西选出来,然后再做表连接。
2、对历史库的计算经验 (这项是说根据不同的使用目的优化使用方法)
历史库计算和使用,分区
3、尽量原子化操作,尽量避免一个SQL包含复杂逻辑
可以使用中间表来完成复杂的逻辑
4、操作 小表要注意放在join的左边(目前TCL里面很多都小表放在join的右边)。
否则会引起磁盘和内存的大量消耗
如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%
5、写SQL要先了解数据本身的特点,如果有join ,group操作的话,要注意是否会有数据倾斜(数据倾斜无非就是大量的相同key被partition分配到一个分区里)
分区这个概念在之前的sql语句中并没有使用到,所以这里着重讲解一下sql
分区:
1.分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
2.分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
3.查看分区语句:
hive> show partitions day_hour_table;
4.在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在最字集的目录中。
5.总的说来partition就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。