《Hive编程指南》笔记

准备工作

  1. 配置mysql数据库为元数据库
    vi hive2.2/conf/hive-site.xml
  2. 加mysql的jdbc的jar包到hive/lib
    (下载地址:https://dev.mysql.com/downloads/connector/j/)
  3. 初始化hive
    $HIVE_HOME/bin/schematool -dbType -initSchema
  4. 启动hive
    H I V E H O M E / b i n / h i v e HIVE_HOME/bin/hive 或者 HIVE_HOME/bin/hive –e ‘your sql’

一、Hive命令行参数

./hive [option]

  1. -d key=value 定义一个变量。
  2. -e “sql” 以命令行方式执行sql。
  3. -f filename.hql 执行filename.hql里面的sql语句。
    ——>在hive命令中的方式为:hive>source filename.hql
  4. -S 不输出,以静默的方式执行
  5. -i /path…/.hiverc 启动时先执行.hiverc中的查询语句(如果未指定,则查找$HOME/.hiverc)
  6. 在hive命令中执行shell命令(在命令前面加!):hive>!ls -l / ;
  7. 在hive中执行hdfs命令:去除 hdfs关键字即可
  8. 在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 字节数组
## 2、集合数据类型 ##
数据类型 描述 例子
STRUCT JAVA中的enum STRUCT{ "JOHN", "TOM" }
MAP 键值对类型 map{"first":"John","last":"Tom"}
ARRAY 数组类型 array{1,2,3,4,5,6,7,8}
## 3、数据类型建表示例 ## CREATE TABLE empoyees( name STRING, salary FLOUT, subordinates ARRAY, deductions MAP
  1. 以下用如图两个表演示结果内容:

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;

五、视图与索引

(一)视图

  1. CREATE VIEW myview AS SELECT * FROM mytable; 创建视图语法
  2. CREATE OR REPLACE VIEW myview AS SELECT * FROM mytable; 创建/更新视图
  3. DROP VIEW [IF EXISTS] myview; 删除视图
  4. ALTER VIEW myview SET TBLPROPERTIES(key=value); 只能更改视图元数据,而不能更改其他东西;

(二)索引

  1. 创建索引:
    CREATE INDEX myindex
     ON TABLE mytable(columnName)
     AS '索引处理器的全限定类名'
     WITH DEFERRED REBUILD		//如果用户指定此选项,则新索引呈现空白状态
     IN TABLE myindextable		//指定创建索引后的表名
     PARTITION(key=value);	//对此分区进行索引创建
    myindex:索引名称
    columnName:创建索引的列的名称
    myindextable:创建索引后的表名
  2. ALTER INDEX myindex ON TABLE mytable PARTITION(key=value) REBUILD; 修改索引
  3. SHOW FORMATTED INDEX ON mytable; 显示索引
  4. DROP INDEX [IF EXISTS] myindex ON mytable; 删除索引

六、模式设计

  1. 关系型数据库中按照天数创建表,在Hive中改成按照天数创建分区。

  2. 分桶:
    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 为表/分区插入或加载本地数据的权限
具体查看转载的博客 [https://blog.csdn.net/yancychas/article/details/84202400](https://blog.csdn.net/yancychas/article/details/84202400) # 八、UDF/UDAF # #### 1、显示函数/描述函数 ####
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.csdn.net/kent7306/article/details/50110067

猜你喜欢

转载自blog.csdn.net/yancychas/article/details/84254346