Hive基本命令解析

1. Hive的分区作用

命令:创建分区

create table t_sz_part(id int, name string)
partitioned by (country string)
row format delimited
fields terminated by ','

往分区中插入数据:load data local inpath '/home/hadoop/sz.dat' into table t_sz_part partition(country = 'China');

说明:首先,创建分区表的时候,需要通过关键字partitioned by (name string) 声明该表是分区表,并且是按照字段name进行分区的;其次,向分区表导入数据的时候,要通过关键字partition(country='China')显示声明数据要导入到表的哪个分区中。所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列country并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如id来分区。

2. Hive的分桶作用

命令:创建分桶

create table t_bluk(id string, name string)
clustered by(id) sort by (id) into 4 buckets;

解析:clustered by(id) 意思是根据id分成4个桶,并且桶内按照id排序。

上述命令执行后,将会在相应的hdfs文件目录下创建四个子目录,如:

可能遇到的问题:当使用命令“insert into t_buck select * from other”时,出现t_buck目录下并没有四个子目录,只有一个子目录,需要如下操作:

① 设置如下变量:

#设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;

② 使用“insert ... select ...”命令向t_buck插入数据才会最终生成四个分区。

额外说明:insert into t_buck select id,name from t_p distribute by (id) sort by (id);

 distribute by (id)指定分区字段; sort by (id) 指定排序字段 

当排序和分桶的字段相同的时候可以使用 distribute by (sno) sort by (sno asc) 或Cluster by(字段)。cluster by等同于分桶+排序(sort)

分区和分桶的区别:分区依据的是伪列,分桶则是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。

3. Hive的join操作解析

 稍后补上

posted @ 2018-05-01 14:57  牧梦者  阅读(1174)  评论(0编辑  收藏  举报