1.3.1 *描述-下Hive动态分区和分桶使用场景和使用方法?
1.分区
按照数据表的某列或某些列分为多个分区,分区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实
这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字 段不存放实际的数据内容,仅仅是分区的表示(伪列)。
(1) 静态分区
create table if not exists sopdm.wyp2(id int,name string,tel string)
partitioned by(age int) row format delimited fields terminated by ,' stored as textfile;
--overwrite是覆盖,into 是追加
insert into table sopdm.wyp2 partition(age='25') select id,name,tel from sopdm.wyp;
(2)动态分区
--设置为true表示开启动态分区功能(默认为false)
set hive.exec.dynamic.partition=true;
-设置为nonstrict,表示允许所有分区都是动态的(默认为strict)
set hive.exec.dynamic.partition.mode=nonstrict;
--insert overwrite是覆盖,insert into是追加
set hive.exec. dynamic.partition.mode=nonstrict;
insert overwrite table sopdm.wyp2 partition(age) select id,name,tel,age from sopdm.wyp;
(3)静态分区和动态分区的区别
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说:
静态分区:
➢ 静态分区是 在编译期间指定的指定分区名。
➢ 支持load和insert 两种插入方式。
➢ 适用于分区数少, 分区名可以明确的数据。
动态分区:
➢ 根据分区 字段的实际值,动态进行分区。
➢ 是在sql执行的时候进行分区。
➢ 需要先将动态分区 设置打开。
set hive.exec.dynamic.partition.mode=nonstrict
➢ 只能用insert方式。
➢ 通过普通表选出的字段包含分区字段,分区字段放置在最后,多个分区字段按照分区顺序放置。
2.分桶
分桶;是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到
一个文件,取模为2的数据存放到一个文件。
CREATE TABLE bucketed_ _user (id INT) name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;
对于每一一个表(table) 或者分区,Hive 可以进一步组 织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 也是针对某- -列进行桶的组织。Hive 采用对列值哈希,然后除以桶|的个数求余的方式决定该条记录存放在哪个桶当中。把表(或者分区)组织成桶( Bucket)
有两个理由:
(1)获得更高的查询处理效率
桶为表加.上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接.两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有-一个相同的列,如果对这两个表都进
行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling) 更高效
在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
【面试指导&技巧】
一般问到Hive分区,基本上都会问动态分区和静态分区的区别。所以要能够答出他们之间的区别。同时要清晰用法和应用场景。
另外,需要能够结合项目说,自己在项目中,哪些地方用了动态分区。-般涉及按日期分区的,比较多是动态分区。
【注意】
对于分桶表,工作中实际应用场景不多,但需要了解其原理(分桶不要求重点掌握)。
1.3.2 Hive是怎么集成HBase的?具体讲讲?
1.首先我们需要将HBase的客户端jar拷入Hive lib目录下。
2.修改hive/conf'下的hive site.xml配置文件,在最后添加如下属性。
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop</value>
</property>
3.启动Hive,创建表管理表hbase_ table_ 1,指定数据存储在HBase表中。
类似下面的方式:
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
("hbase.columns.mapping"=":key,accuracy:total score,accuracy:question_ count,accuracy:accuracy")
tblproperties("hbase.table.name" = "exam:analysis");
4.往Hive表hbase_ table_ 1表中插入数据。
【注意】
CDH版本不需要额外操作,相同CDH版本下的软件,已经做过整合。
【面试指导&技巧】
如果使用CDH版本,回答重点放在集成的代码上。相关的代码格式需要掌握,需要能够答出Stored by的类型,HBaseStorageHandler 的类。
如果使用的Apache版本,还需要能够答出大致的整合步骤。
1.3.3 Hive查询的时候on和where有什么区别?为什么?
左右关联时:
➢ 条件不为主表条件时, 放在on和whe