hive从⼊门到实战No.2
DML
动态分区模式(让分区成为被查询出来的结果表的字段名称变量)
脚本模板
1INSERT OVERWRITE TABLE tablename
2PARTITION (col_name) select_statement FROM from_statement
设置⾮严格模式
de=nonstric;
将查询结果写⼊hdfs⽬录
INSERT OVERWRITE DIRECTORY directory1 SELECT ... FROM ...
样例--默认
1数据写⼊⽂件系统时进⾏⽂本序列化,且每列⽤^A来区分,\n换⾏
2insert overwrite directory "/tmp/output2/"
3select * from student where come_date='20170905';
样例--指定输分隔符
1insert overwrite directory "/tmp/output2/"
2row format delimited
3fields terminated by '\t'
4select * from student where come_date='20170905';
关于外表的说明和使⽤
内外表的唯⼀区分标识,即为external关键字.创建表时候有,则为外表,没有则默认均为内表
内表和外表的hdfs⽬录,均可以⾃由指定location,如不指定,则数据存储在hive的默认hdfs⽬录中,且后续均可以⾃由改变,但改变的场景不多,⼀般为了省事都不会轻易改变存储⽬录
应⽤场景
如果表数据是外部load过来的,即为不可hive内部⾃⽣成,此时的表必须是外表.
如果表数据是hive内部可以⾃⽣成,即不需要依赖外部的load数据,则此时的表应该是内表
DQL
脚本模板
1SELECT [DISTINCT] select_expr, select_expr, ...
2FROM table_reference
3[WHERE where_condition]
4[GROUP BY col_list [HAVING condition]]
5[ CLUSTER BY col_list
6  | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
7]
8[LIMIT number]
join查询
将多个表通过字段关联在⼀起,形成查询结果
inner join
将左表和右表满⾜联接条件的数据,全部查询出来
left outer join
以左表为主,将左表数据全部保留,右表没有关联上数据字段置成NULL                left outer join
以左表为主,将左表数据全部保留,右表没有关联上数据字段置成NULL                full outer join
没有关联上数据字段全部置成NULL
full join=inner join+left join+right join
union
union all
将所有表数据,完全叠加在⼀起,不去重。
Hive系统函数
查看所有系统函数
show functions
函数分类
使⽤⽰例
desc function split
count  统计记录⾏数
1/最常见,但效率低
2select count(*) from student;
3//推荐使⽤,效率⾼
4select count(1) from student;
if  IF( Test Condition, True Value, False Value )
coalesce  COALESCE( value1,value2,... )将参数列表中第1个不为null的值作为最后的值
split    将字符串拆分成⼀个数组
e
xplode:表成⽣成函数    将⼀个集合元素,打散成⼀⾏⼀⾏的组成,即将⼀⾏改成多⾏,换句话说⾏转列        l ateral view:  与explode联⽤,形成⼀张新表
创建⽤户得分表                  插⼊相应数据
1
maven打包本地jar包CASE  [ expression ] 2
WHEN condition1 THEN result1 3
WHEN condition2 THEN result2 4
(5)
WHEN conditionn THEN resultn 6  ELSE result 7END
1
create table user_score(2
id int,3
name string,4score_list string 5);
1insert into table user_score values(1,'one','90,80,70');
2insert into table user_score values(2,'two','65,75,85');
3insert into table user_score values(3,'three','55,40,85');
查看内部数据
通过explode将⼀⾏转换成多⾏,通过lateral view将多⾏转换成⼀个表
标准使⽤
求分数⼤于等于80分的有多少⼈
hive⾃定义函数
UDF(user defined function)
背景
1. 系统内置函数⽆法解决所有的实际业务问题,需要开发者⾃⼰编写函数实现⾃⾝的业务实现诉求。
2. 应⽤场景⾮常多,⾯临的业务不同导致个性化实现很多,故udf很需要。
意义
1. 函数扩展得到解决,极⼤丰富了可定制化的业务需求。
IO要求-要解决的问题
1. in:out=1:1,只能输⼊⼀条记录当中的数据,同时返回⼀条处理结果。
2. 属于最常见的⾃定义函数,像cos,sin,substring,instr等均是如此要求。
实现步骤(Java创建⾃定义UDF类)
1. ⾃定义⼀个java类
2. 继承UDF类
3. 约定俗成的重写evaluate⽅法
4. 打包类所在项⽬成⼀个all-in-one的jar包并上传到hive所在机器
5. 在hive中执⾏add jar操作,将jar加载到classpath中。
6. 在hive中创建模板函数,使得后边可以使⽤该函数名称调⽤实际的udf函数
hive sql中像调⽤系统函数⼀样使⽤udf函数
代码实现
1. 功能要求:实现当输⼊字符串超过2个字符的时候,多余的字符以"..."来表⽰。
2. 如“12”则返回“12”,如“123”返回“12..."
3. ⾃定义类、继承UDF、约定俗成的“重写”evaluate⽅法已在代码中体现
1package com.tianliangedu.hive.udf;
2import org.apache.hadoop.UDF;
3/*
4 * 功能:实现当输⼊字符串超过2个字符的时候,多余的字符以"..."来表⽰。
5 * 输⼊/输出:* 如“12”则返回“12”,如“123”返回“12..."
6 */
7public class ValueMaskUDF extends UDF{
8      public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
9            if(input.length()<=maxSaveStringLength){
10                    return input;
11            }
12            return input.substring(0,maxSaveStringLength)+replaceSign;
13      }
14      public static void main(String[] args) {
15            System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));
布署步骤
1. maven管理
采⽤maven管理打包的⽅式,maven pom配置项为:
1<project xmlns="/POM/4.0.0"; xmlns:xsi="/2001/XMLSchema-instance";
2xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd";>
3 <modelVersion>4.0.0</modelVersion>
4 <groupId>urse</groupId>
5 <artifactId>TlHadoopCore</artifactId>
6 <version>0.0.1-SNAPSHOT</version>
7<!-- 设置编码为 UTF-8 -->
8 <properties>
9  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
10  &ding>UTF-8</ding>
11 </properties>
12 <!-- ⾸先配置仓库的服务器位置,⾸选阿⾥云,也可以配置镜像 -->
13 <repositories>
14  <repository>
15  <id>nexus-aliyun</id>
16  <name>Nexus aliyun</name>
17  <url>maven.aliyun/nexus/content/groups/public</url>
18  </repository>
19 </repositories>
20
21 <dependencies>
22  <!-- 引⼊hadoop-cli-2.7.4依赖 -->
23  <dependency>
24  <groupId>org.apache.hadoop</groupId>
25  <artifactId>hadoop-client</artifactId>
26  <version>2.7.4</version>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。