《Hive编程指南》笔记

本文详述了Hive数据库的配置流程,包括MySQL作为元数据库的设置、JDBC驱动的添加及hive命令行参数的使用。深入解析了Hive的数据类型、表创建、SQL查询、权限管理、UDF/UDAF自定义函数的开发,以及视图、索引、模式设计、分桶等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

  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 或者 HIVEHOME/bin/hiveHIVE_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、基本数据类型

数据类型长度例子
TINYINT1字节有符号整数20
SMALINT2字节有符号整数20
INT4字节有符号整数20
BIGINT8字节有符号整数20
BOOLEAN布尔类型TRUE
FLOUT单精度浮点数3.14159
DOUBLE双精度浮点数3.14159
STRING字符串序列“I love you”
TIMESTAMP证书、浮点数或字符串
BINARY字节数组
## 2、集合数据类型 ##
数据类型描述例子
STRUCTJAVA中的enumSTRUCT{ "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.youkuaiyun.com/yancychas/article/details/84202400](https://blog.youkuaiyun.com/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.youkuaiyun.com/kent7306/article/details/50110067

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值