《Hive编程指南》笔记
准备工作
- 配置mysql数据库为元数据库
vi hive2.2/conf/hive-site.xml - 加mysql的jdbc的jar包到hive/lib
(下载地址:https://dev.mysql.com/downloads/connector/j/) - 初始化hive
$HIVE_HOME/bin/schematool -dbType -initSchema - 启动hive
HIVE_HOME/bin/hive –e ‘your sql’
一、Hive命令行参数
./hive [option]
- -d key=value 定义一个变量。
- -e “sql” 以命令行方式执行sql。
- -f filename.hql 执行filename.hql里面的sql语句。
——>在hive命令中的方式为:hive>source filename.hql - -S 不输出,以静默的方式执行
- -i /path…/.hiverc 启动时先执行.hiverc中的查询语句(如果未指定,则查找$HOME/.hiverc)
- 在hive命令中执行shell命令(在命令前面加!):hive>!ls -l / ;
- 在hive中执行hdfs命令:去除 hdfs关键字即可
- 在hiveconf中设置hive.cli.print.header为true 显示字段名称
二、Hive中的数据类型
1、基本数据类型
数据类型 | 长度 | 例子 |
TINYINT | 1字节有符号整数 | 20 |
SMALINT | 2字节有符号整数 | 20 |
INT | 4字节有符号整数 | 20 |
BIGINT | 8字节有符号整数 | 20 |
BOOLEAN | 布尔类型 | TRUE |
FLOUT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符串序列 | “I love you” |
TIMESTAMP | 证书、浮点数或字符串 | |
BINARY | 字节数组 |
数据类型 | 描述 | 例子 |
STRUCT | JAVA中的enum | STRUCT{ "JOHN", "TOM" } |
MAP | 键值对类型 | map{"first":"John","last":"Tom"} |
ARRAY | 数组类型 | array{1,2,3,4,5,6,7,8} |
- 以下用如图两个表演示结果内容:
1、INNER JOIN 内连接(优化:表从左往右依次变大)
语句:
SELECT a.name,a.number,b.name
FROM table1 a JOIN table2 b
ON a.number=b.number;
结果:
注意:老版本不支持非等值join
新版本(1.2.0以后)支持非等值join,但是语法必须如下:
select a.name b.* from t_1 a,t_2 b where a.id>b.id; //(不加join关键字)
### 2、LEFT OUTER JOIN 左外连接 ###
语句:
SELECT a.name,a.number,b.name
FROM table1 a LEFT OUTER JOIN table2 b
ON a.number=b.number;
结果:
3、RIGHT OUTER JOIN 右外连接
语句:
SELECT,a.name,a.number,b.name
FROM table1 a RIGHT OUTER JOIN table2 b
ON a.number=b.number;
结果:
4、FULL OUTER JOIN 全外连接
语句:
SELECT a.name,a.number,b.name
FROM table1 a FULL OUTER JOIN table2 b
ON a.number=b.number;
结果:
5、LEFT SEMI JOIN 左半开连接
注意:左半开连接的SELECT和WHERE不能引用右半边表的字段
语句:
SELECT a.name,a.number
FROM table1 a LEFT SEMI JOIN table2 b
ON a.number=b.number;
结果:
6、JOIN 笛卡尔积连接
注意:就是内连接不加ON的条件
语句:
SELECT a.name,a.number,b.name
FROM table1 a JOIN table2 b;
五、视图与索引
(一)视图
- CREATE VIEW myview AS SELECT * FROM mytable; 创建视图语法
- CREATE OR REPLACE VIEW myview AS SELECT * FROM mytable; 创建/更新视图
- DROP VIEW [IF EXISTS] myview; 删除视图
- ALTER VIEW myview SET TBLPROPERTIES(key=value); 只能更改视图元数据,而不能更改其他东西;
(二)索引
- 创建索引:
myindex:索引名称CREATE INDEX myindex ON TABLE mytable(columnName) AS '索引处理器的全限定类名' WITH DEFERRED REBUILD //如果用户指定此选项,则新索引呈现空白状态 IN TABLE myindextable //指定创建索引后的表名 PARTITION(key=value); //对此分区进行索引创建
columnName:创建索引的列的名称
myindextable:创建索引后的表名 - ALTER INDEX myindex ON TABLE mytable PARTITION(key=value) REBUILD; 修改索引
- SHOW FORMATTED INDEX ON mytable; 显示索引
- DROP INDEX [IF EXISTS] myindex ON mytable; 删除索引
六、模式设计
-
关系型数据库中按照天数创建表,在Hive中改成按照天数创建分区。
-
分桶:
CLUSTER BY (字段) INTO num BUCKETS
创建表时(CREATE TABLE)使用,用于把数据按照(字段)均匀的分在num个桶中-----
这里我们需要注意几点我们需要确保reduce 的数量与表中的bucket 数量一致,为此有两种做法
(1)让hive强制分桶,自动按照分桶表的bucket 进行分桶。(推荐)
set hive.enforce.bucketing = true;
(2)手动指定reduce数量
set mapreduce.job.reduces = num; set mapreduce.reduce.tasks = num;
并在 SELECT 后增加CLUSTER BY 语句
七、权限管理
1、开启Hive权限
hive> set hive.security.authorization.enabled=true;
2、对用户或用户组授予权限
GRANT [CREATE|SELECT|...]
ON [DATABASE|TABLE] database_or_table_name
TO [USER|GROUP] user_or_group_name;
3、对用户授予角色
CREATE ROLE rule_name; //创建角色
GRANT [SELECT|CREATE|...] ON TABLE table_name TO ROLE role_name; //赋予角色权限
GRANT ROLE role_name TO [USER|GROUP] user_name; //赋予用户角色
4、删除授权
REVOKE [SELECT|CREATE|...]
ON [DATABASE|TABLE] database_or_table_name
FROM [USER|GROUP] user_or_group_name;
5、分区表的授权
默认情况下,分区表的授权将会跟随表的授权,也可以给每一个分区建立一个授权机制,只需要设置表的属性PARTITION_LEVEL_PRIVILEGE设置成TRUE
hive> ALTER TABLE auth_part
> SET TBLPROPERTIES ("PARTITION_LEVEL_PRIVILEGE"="TRUE");
Authorization failed:No privilege 'Alter' found for inputs
{database:default, table:auth_part}.
Use show grant to get more details.
6、自动授权
(1)表创建者的权限
(2)其他用户的权限
7、常用授权关键字
名称 | 描述 |
ALL | 所有权限 |
ALTER | 更改表结构,创建分区 |
CREATE | 创建表 |
DROP | 删除表,或分区 |
INDEX | 创建和删除索引 |
LOCK | 锁定表,保证并发 |
SELECT | 查询表权限 |
SHOW_DATABASE | 查看数据库权限 |
UPDATE | 为表/分区插入或加载本地数据的权限 |
SHOW FUNCTIONS;
DESCRIBE FUNCTION [EXTENDED] function_name;
#### 2、加入函数 ####
ADD JAR /root/... //路径不要加入引号
CREATE TEMPORARY FUNCTION function_name AS '完全限定类名'
#### 3、自定义UDF ####
1. 继承UDF
2. 重写evaluate方法
#### 4、自定义UDAF ####
1. 继承AbstractGenericUDAFResolver,实现getEvaluator方法(返回:继承GenericUDAFEvaluator的自定义类)
2. 继承GenericUDAFEvaluator的自定义类,实现init、getNewAddregationBuffer、iterate、terminatePartial、merge、terminate方法
具体见http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888051.html
https://blog.****.net/kent7306/article/details/50110067