进公司实习,第一个任务就是自学hive。。。。
知识点总结帮助自己学习
Hive -语法:
非关系型数据库语言,语言逻辑与MySQL大致相似,但是要求能够更加严格一点。
hive> ALTER TABLE student1 ADD COLUMNS
> (address STRING,grade STRING);
在添加属性的时候,需要添加columns关键字(列)
•ROW FORMAT DELIMITED 行格式分隔
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE
Distinct:查询的数据去重
LOAD DATA LOCAL INPATH '/home/hadoop/djt/user.txt' INTO TABLE group_test;
从指定位置向指定表中导入数据(保留源文件)
ORDER BY 会对输入做全局排序,因此只有一个 Reduce(多个 Reduce 无法保证全局有序)会导致当输入规模较大时,需要较长的计算时间。使用 ORDER BY 查询的时候,为了优化查询的速度,使用 hive.mapred.mode 属性。
hive.mapred.mode = nonstrict;(default value/默认值) 默认是不精确的
hive.mapred.mode=strict;
与数据库中 ORDER BY 的区别在于,在 hive.mapred.mode=strict 模式下必须指定limit ,否则执行会报错。
hive> set hive.mapred.mode=strict;
hive> select * from group_test order by uid limit 5;
在设置hive.mapred.mode为精确时,必须添加limit限制条件,否则会报错
CLUSTER BY 查询
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。
创建索引:
hive> create index user_index on table user(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild IN TABLE user_index_table;
创建索引,索引名称为:user_index 在user表,表的user(id)为索引
Hive关键字concat_ws:带着间隔符号的拼接,使用语法:
hive> select concat_ws(‘,’,'abc’,'def’,'gh’) from dual;
输出结果:abc,def,gh
字符串长度:length,字符串翻转:reverse,字符串拼接concat
字符串截取:substring,substr
字符串转大写:upper(string a),ucase(string a)
字符串转小写:lower(string a) ,lcase(string a)
去两侧空格函数:trim(String a)
去左侧空格ltrim 去右侧空格rtrim
个数统计:count 和统计:sum
求平均数:avg
求最大最小值:max,min
复合类型操作;
Map类型:create table map_test as select map( kay,value,kay,value) from student
Struct类型:根据输入的参数构造结构体类型
语法:
hive> create table array_test as select array('jay','liu','gang') from student;
hive> describe array_test;
hive> select array_test from array_test;
用户自定义函数udf:
Hive支持的udf用户自定义函数有三种:udf函数可以直接作用于select语句,对查询结构做格式化处理之后,在输出内容
用户自定义函数 UDF
UDF(User Defined Function,用户自定义函数) 对数据进行处理。UDF 函数可以直接应用于 select 语句,对查询结构做格式化处理后,再输出内容。
Hive可以允许用户编写自己定义的函数UDF,来在查询中使用。Hive中有3种UDF:
1)UDF:操作单个数据行,产生单个数据行。
2)UDAF:操作多个数据行,产生一个数据行。
3)UDTF:操作一个数据行,产生多个数据行一个表作为输出。
用户构建的UDF使用过程如下:
第一步:继承UDF或者UDAF或者UDTF,实现特定的方法。
第二步:将写好的类打包为jar。如hivefirst.jar。
第三步:进入到Hive外壳环境中,利用add jar /home/hadoop/hivefirst.jar 注册该jar文件。
第四步:为该类起一个别名,create temporary function mylength as 'com.whut.StringLength';这里注意UDF只是为这个Hive会话临时定义的。
第五步:在select中使用mylength()。
实现特定方法,打包为jar,进入外壳环境注册,为该类起个别名,在查询语句中使用
注意事项:
- 一个用户UDF必须继承org.apache.hadoop.hive.ql.exec.UDF;
2、一个UDF必须要包含有evaluate()方法,但是该方法并不存在于UDF中。evaluate的参数个数以及类型都是用户自己定义的。在使用的时候,Hive会调用UDF的evaluate()方法。
角色的创建与删除:
Create role role_name;
角色删除:drop role role_name
角色的授权与撤销:
将角色role_test授权给X:
Grant role role_test to user X;
取消用户X的授权:
Revoke role role_test from user X;
授权用户某种权限
Grant select on database default to user X;
给予搜索权限在数据库权限中,to用户X
查看用户权限;
Show grant user X on database default;
显示权限: 用户X在该数据库权限中
收回用户权限
Revoke select on database default from user X;
收回指定权限在数据库的权限范围内,从用户 X
Revoke select on database default from user X;
创建外部表
分区表
插入select数据到表中
case when
查看表结构
hadoop命令
order by
group by
连接跳板机: 1.50 0 su - work 密码:music2016 hive
动态分区:在进行动态分区操作时,需要打开一个设置:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
Hive中的桶操作:是通过partition的clustered by(集群分布)实现的,bucket中的数据主要是通过sort by实现的
Collection items terminated by “,”:使用逗号分隔符
Hive复合数据类型:array,struct,map
在select语句中使用复合数据类型的时候的格式如下:
Map使用:
Create table student (id INT, name map<String ,int>)
Row format delimited
Fields terminated by ‘\t’
Collection items terminated by ‘,’
Map keys terminated by ‘:’;
在使用struct和array时,不需要添加类似Map keys terminated by ‘:’;语句
Map查询操作:在select语句中需要使用‘[‘’]’ 语法:
Select name[‘string’] from student
Array使用:
Create table student (name String, student_id_list array<int>)
Row format delimited
Fields terminated by ‘\t’
Collection items terminated by ‘,’;
Array查询操作:在select语句中需要使用‘[]’ 语法:
Select student_id_list[3] from student
Struct使用:
Create table student (id INT, info struct <name:String , age:int>)
Row format delimited
Fields terminated by ‘\t’
Collection items terminated by ‘,’;
Struct查询操作:在select语句中需要使用‘.’ 语法:
Select info.age from student
Hive只支持等连接,外连接,左半连接,而且hive可以join两个以上的表
只有等连接时才可以使用
org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler
创建分区表的时候不需要collection语句
目前已经知道的需要collection的语句只有三种复合结构,而且,map还需要keys的分隔符
创建分区表:语法
Create table X(age int,name string)partition by(id int,class int)
Row format delimit
Fields terminated by‘,’
Age和name是真实例,id和class是伪例
创建动态分区的时候,必须采用非严格模式,并设置分区模式为true
分区缺省为false
Hive的数据优化:按照指定规则分区,合理设置bucket
Join原则:在使用join语句时,应该将条目少的表或者子查询放在join的左边
用户自定义函数UDF:
Hive中一共有三种用户自定义函数:
分别是:UDF:操作单个数据行,产生单个数据行
UDAF:操作多个数据行,产生一个数据行
UDTF:操作一个数据行,产生多个数据行,一个表输出
用户构建UDF使用过程如下:
第一步:继承UDF或者UDTF或者UDAF,实现特定方法
第二步:将写好的类打包成jar
第三步:进入到Hive的外壳环境当中,利用add jar /home/hadoop/..... .jar 注册该文件
第四步:为该类起一个别名 create temporary function XXX as ‘com.whut.StringLength’;
UDF只是为这个Hive回话临时定义的
第五步:在select中使用XXX。