HIVE分桶、动态分区、LATERAL VIEW 视图索引、GUI安装
一、hive参数
hive当中的参数、变量,都是以命名空间开头
通过${}方式进行引用,其中system、env下的变量必须以前缀开头
命名空间 | 读写权限 | 含义 |
---|---|---|
hiveconf | 可读写 | hive-site.xml当中的各配置变量 例:hive --hiveconf hive.cli.print.header=true |
system | 可读写 | 系统变量,包含JVM运行参数等 例:system:user.name=root |
env | 只读 | 环境变量 例:env:JAVA_HOME |
hivevar | 可读写 | 例:hive -d val=key |
hive 参数设置方式
1、修改配置文件 ${HIVE_HOME}/conf/hive-site.xml
2、启动hive cli时,通过–hiveconf key=value的方式进行设置
例:hive --hiveconf hive.cli.print.header=true
3、进入cli之后,通过使用set命令设置
在hive CLI控制台可以通过set对hive中的参数进行查询、设置
set设置: set hive.cli.print.header=true;
set查看: set hive.cli.print.header
hive参数初始化配置
当前用户家目录下的.hiverc文件 如: ~/.hiverc
如果没有,可直接创建该文件,将需要设置的参数写到该文件中,hive启动运行时,会加载改文件中的配置。
hive历史操作命令集 ~/.hivehistory
二、动态分区与分桶
分区 的效果:根据不同分区字段把数据划分到不同的子目录进行管理
分桶 的效果:将一个目录下的一个数据文件划分成多个数据文件
在未导入的数据文件中划分更细致管理
动态分区
动态分区,可以理解为根据数据的某一字段进行分区,例如不同的年龄
**Tips:**因为LOAD DATA LOCAL INPATH ‘/root/data1’ INTO TABLE tablename partition (age=10);导入是整个数据(将本地文件先移动到hdfs上再移动到tablename的目录下),分区也是对整个数据进行分区,所以此方法不适合在动态分区中导入数据。
普通分区是将整个数据上传之后再对整个数据进行分区
1 开启支持动态分区
set hive.exec.dynamic.partition=true;
默认:true
set hive.exec.dynamic.partition.mode=nostrict;
Tips:动态分区是非严格模式
默认:strict(至少有一个分区列是静态分区)
[外链图片转存失败(img-RNEbF9od-1563925142943)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561688412120.png)]
根据需求调整其他相关参数
set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)
2 创建动态分区步骤
开启支持分区后,先创建分区表21,再创建普通表22,先将数据导入普通表22中,将分区字段定义为普通字段,再通过语句:
from 22 insert overwrite table 21 partition(xx,oo) select (全部字段名)distribute by xx,oo;
将普通表数据导入分区表
[外链图片转存失败(img-pbZAAVqz-1563925142943)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561687602951.png)]
from psn21
insert overwrite table psn22 partition(age, sex)
select id, name, age, sex, likes, address distribute by age, sex;
分桶
分桶表 是对指定列的列值取哈希值的方式,将不同数据放到不同文件中存储。
有几个桶hdfs上有几个分目录文件
应用场景:抽样(数据在分桶时打散),表关联数据(相同/倍数关系的桶号相关联)
eg:如果是按照数据中的id进行分3桶管理,则取模后存放在0,1,2三个文件中
1 开启支持分桶规则
set hive.enforce.bucketing=true;
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致。
[外链图片转存失败(img-hEzCnSF1-1563925142943)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561689818092.png)]
2 建表规则:
[CLUSTERED BY (col_name, col_name, …) [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
3 分桶表中加载数据规则
insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;
4 TABLESAMPLE语法
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个bucket开始抽取数据 取 x (x+y …)桶的数据
y:必须为该表总bucket数的倍数或因子 因子代表只取x桶的部分数据
eg1:桶表 抽样查询
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
eg2:
当表中总bucket桶数为32时
tablesample(bucket 2out of 16),抽取
共抽取2(32/16)个bucket桶的数据,抽取第2、第18(16+2)2个bucket桶的数据
eg3:
当表中总bucket桶数为32时
tablesample(bucket 3 out of 8),抽取
x=3 从3号桶取数据
32/8=4 取4个桶
3,,3+8=11,11+8=19,19+8=27
eg4:
当表中总bucket桶数为32时
TABLESAMPLE(BUCKET 3 OUT OF 256),抽取
x=3 从3号桶取数据
32/256=1/8 取1/8个桶
5 创建分桶(以抽样应用场景为例)
开启分桶规则后,先创建普通表,导入数据进普通表。再创建分桶表,加载数据。
eg:
创建分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
加载数据:
insert into table psnbucket select id, name, age from psn31;
抽样
select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
三、Lateral View、视图、索引
1 Lateral View
Lateral View用于和UDTF函数(explode、split)结合来使用。
将数据写入一个虚拟表中,然后对其虚拟表进行操作
用来解决普通UDTF查询无法同时显示多个字段问题
语法
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)
首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
eg:
select count(distinct(myCol1)), count(distinct(myCol2)) from psn2
LATERAL VIEW explode(likes) myTable1 AS myCol1 arr类型 myCol1 —> K
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3; map类型 myCol2, myCol3 —>K,V
Tips: distinct --去重
count(distinct(myCol1) – 对myCol1字段进行去重统计个数
2 视图
视图是将基本/简单的查询写入视图中,当需要进行查询时,直接对视图进行查询即可
只能查询,不能做加载数据操作
view定义中若包含了ORDER BY/LIMIT语句,当查询视图时也进行ORDER BY/LIMIT语句操作,view当中定义的优先级更高
view支持迭代视图
语法
创建视图
CREATE VIEW [IF NOT EXISTS][db_name.]view_name
[(column_name [COMMENT column_comment], …) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, …)]
AS SELECT … ;
查询视图
select colums from view;
删除视图
DROP VIEW [IF EXISTS][db_name.]view_name;
3 索引
目的:优化查询以及检索性能 索引有资源的开销
Tips:创建索引后要对其进行重建才能将数据写入
语法
创建索引
create index t1_index on table psn2(name)
as ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’ with deferred rebuild
in table t1_index_table;
create index t1_index on table psn2(name)
as ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’ with deferred rebuild;
Tips:
as:指定索引器;
in table:指定索引表,若不指定默认生成在default__psn2_t1_index__表中
查询索引
show index on psn2;
重建索引(建立索引之后必须重建索引才能生效)
ALTER INDEX t1_index ON psn REBUILD;
删除索引
DROP INDEX IF EXISTS t1_index ON psn2;
四、hive运行方式
1 命令行方式cli:控制台模式
----hive beeline
与hdfs交互 dfs -cat 文件路径; 查看文件信息
与Linux交互 !pwd 当前目录
2 脚本运行方式
实际生产环境中用最多 hive -e sql
hive -e “”
hive -e “”>aaa
hive -S -e “”>aaa
hive -f file
hive -i /home/my/hive-init.sql
hive> source xxx.sql (在hive cli中运行)
3 JDBC方式:hiveserver2
https://www.cnblogs.com/double-kill/articles/8931515.html
4 web GUI接口 (hwi、hue等)
Tips:
jar -cvf hive-hwi.war * -----------windows 打包命令
UI界面 主要用于查看元数据
web界面安装步骤:
1 下载源码包 apache-hive-*-src.tar.gz
2 将hwi war包放在 linux的$HIVE_HOME/lib/
1-1 具体制作方法:将hwi/web/*里面所有的文件打成war包
1-2 进入windows的cmd,进入所存放的解压包apache-hive-1.2.1-src目录web下
cd apache-hive-1.2.1-src/hwi/web
jar -cvf hive-hwi.war *
1-3 复制tools.jar(在jdk的lib目录下)到$HIVE_HOME/lib下
1-4 追加修改hive-site.xml
修改hive配置文件hive-site.xml添加以下配置内容:
hive.hwi.listen.host
0.0.0.0
hive.hwi.listen.port
9999
hive.hwi.war.file
lib/hive-hwi.war
1-5 启动hwi服务(端口号9999) hive --service hwi
浏览器通过以下链接来访问http://sxt3:9999/hwi/