Hive进阶(下)

Hive进阶(下)

Hive的表连接

等值连接

查询员工信息:员工号、姓名、月薪、部门名称

1.select e.empno,e.ename,e.sal,d.dname
2.from emp e,dept d
3.where e.deptno=d.deptno;

不等值连接

查询员工信息:员工号、姓名、月薪、工资级别

1.select e.empno,e.ename,e.sal,s.grade
2.from emp e,salgrade s
3.where e.sal between s.losal and s.hisal;

外连接

通过外连接可以将对于连接条件不成立的记录仍然包含在最后的结果中

  • 左外连接(当连接条件不成立的时候,连接条件左边的表仍然包含在最后结果中)
  • 右外连接(类似上面)

按部门统计员工人数:部门号、部门名称、人数

1.select  d.deptno,d.dname,count(e.empno)
2.from emp e right join dept d
3.on (e.deptno=d.deptno)
4.group by d.deptno,d.dname;

自连接

自连接的核心:通过表的别名将同一张表视为多张表

查询员工的姓名和员工的老板姓名

1.select e.ename,b.ename
2.from emp e,emp b
3.where e.mgr=b.empno;

Hive的子查询

hive只支持fromwhere子句中的子查询

主查询和子查询可以不是同一张表

1.select e.ename from emp e where e.deptno in (select d.deptno from dept d where d.dname='SALES' or d.dname='ACCOUNTING');

注意空值问题

1.select * from emp e where e.empno not in (select e1.mgr from emp e1 where e1.mgr is not null);

Hive的JAVA客户端操作

  • 要使用Java的客户端操作,之前我们必须启动Hive的远程服务
1.#hive --service hiveserver

当出现Starting Hive Thrift Server,就证明Hive服务器端已经启动

我们有两种方式进行hive的java客户端操作:

  • JDBC
  • Thrift Client

Hive的JDBC客户端操作

步骤

  1. 获取连接
  2. 创建运行环境
  3. 执行HQL
  4. 处理结果
  5. 释放资源

进入hive的lib目录下有hive所有需要依赖的jar包,有一个hive-jdbc.jar文件,这个文件就是hive的JDBC的驱动。我们需要将其拷贝到工程里面

我们还需要将这个jar包加入到系统的路径里面



创建一个类,以帮助我们获取连接和释放资源

1.package demo.utils;
2.
3.public class JDBCUtils{
4.
5. private static String driver="org.apache.hadoop.hive.jdbc.HiveDriver";
6. private static String url="jdbc:hive://192.168.56.31:10000/default";//192.168.56.31是ip地址,default是所要连接的数据库名称
7.
8. //注册驱动
9. static{
10. try{
11. Class.forName(driver);
12. }catch(ClassNotFoundException e){
13. throw new ExceptionInInitializerError(e);
14. }
15. }
16.
17. //获取连接
18. public static Connection getConnection(){
19. try{
20. return DriverManager.getConnection(url);
21. }catch (SQLException e){
22. //TODO Auto-generated catch block
23. e.printStackTrace();
24. }
25. return null;
26. }
27.
28. //释放资源
29. public static void release(Connection conn,Statement st,ResultSet rs){
30. if(rs !=null){
31. try{
32. rs.close();
33. }catch (SQLException e){
34. e.printStackTrace();
35. }finally{
36. rs=null;
37. }
38. }
39. if(st !=null){
40. try{
41. st.close();
42. }catch (SQLException e){
43. //TODO Auto-generated catch block
44. e.printStackTrace();
45. }finally{
46. st=null;
47. }
48. }
49. if(conn !=null){
50. try{
51. conn.close();
52. }catch (SQLException e){
53. //TODO Auto-generated catch block
54. e.printStackTrace();
55. }finally{
56. conn=null;
57. }
58. }
59. }
60.}

创建一个类来查询hive中的数据

1.package demo.hive
2.
3.public class HiveJDBCDemo{
4.
5. /**
6. * @param args
7. */
8. public static void main(String[] args){
9. Connection conn=null;
10. Statement st=null;
11. ResultSet rs=null;
12.
13. String sql="select * from emp";
14. try{
15. //获取连接
16. conn=DBCUtils.getConnection();
17. //创建运行环境
18. st=conn.createStatement();
19. //运行HQL
20. rs=st.executeQuery(sql);
21. //处理数据
22. while(rs.next()){
23. //取出员工的姓名和薪水
24. String name=rs.getString(2);
25. double sal=rs.getDouble(6);
26. System.out.println(name+"\t"+sal);
27. }
28. }catch (Exception e){
29. e.printStackTrace();
30. }finally{
31. JDBCUtils.release(conn,st,rs);
32. }
33. }
34.}

运行上面的代码出错,显示jar找不到,因此还需要将其他的jar加到环境中

Hive的Thrift Java客户端操作



同样创建一个新的文件

1.package demo.hive;
2.
3.import org.apache.thrift.transport.TSocket;
4.
5.public class HiveThriftClient{
6.
7. public static void main(String[] args) throws Exception{
8. //创建Socket:连接
9. final TSocket tSocket=new TSocket("192.168.56.31",10000);
10.
11. //创建一个协议
12. final TProtocol tProtcal=new TBinaryProtocol(tSocket);
13.
14. //创建Hive Client
15. final HiveClient client=new HiveClient(tProtcal);
16.
17. //打开Socket
18. tSocket.open();
19.
20. //执行HQL
21. client.execute("desc emp");
22. //处理结果
23. list<String> columns=client.fetchAll();
24. for(String col:columns){
25. System.out.println(col);
26. }
27.
28. //释放资源
29. tSocket.close();
30. }
31.}

开发Hive的自定义函数

Hive的自定义函数(UDF 即 User Defined Function),可以直接应用程序于select语句,对查询结果做格式化处理后,再输出内容

Hive自定义函数的实现细节

  • 自定义UDF需要继承org.apache.hadoop.hive.ql.UDF
  • 需要实现evaluate函数,evaluate函数支持重载

Hive自定义函数的部署运行

  • 把程序打包放到目标机器上去
  • 进入hive客户端,添加jar包
1.hive> add jar /root/training/udfjar/udf_test.jar
  • 创建临时函数
1.hive> CREATE TEMPORARY FUNCTION <函数名> AS 'Java类名';
  • Hive自定义函数的使用
1.select <函数名> from table;
  • 销毁临时函数
1.hive> DROP TEMPORARY FUNCTION <函数名>;

UDF案例——拼加两个字符串

在文本工程下面新建一个类

1.package demo.udf;
2.
3.import org.apache.hadoop.hive.ql.exec.UDF;
4.
5.public class ConcatString extends UDF{
6.
7. public evaluate(Text a,Text b){
8. return new Text(a.toString()+"****"+b.toString());
9. }
10.}

然后将其导出成一个jar文件

然后将其上传到hive服务器上

然后

1.hive> add jar /root/training/udfjar/concatstring.jar;

执行添加jar文件

然后创建一个临时函数

1.hive> create temporary function myconcat as 'demo.udf.ConcatString';

然后调用这个函数

1.hive> select myconcat('Hello','World');

得到结果

1.Hello **** World

Hive进阶(下)的更多相关文章

  1. Hive进阶(上)

    Hive进阶(上) Hive进阶(上) 执行数据导入 使用Load语句 语法: 1.LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE ...

  2. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  3. Docker入门与进阶(下)

    Docker入门与进阶(下) 作者 刘畅 时间 2020-11-12 实验主机配置 系统centos7.5 主机名 ip 配置 应用 harbor-master 172.16.1.71 2核4G/60 ...

  4. Spark入门实战系列--5.Hive(下)--Hive实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步   启动HDFS ...

  5. Hive学习之六 《Hive进阶— —hive jdbc》 详解

    接Hive学习五 http://www.cnblogs.com/invban/p/5331159.html 一.配置环境变量 hive jdbc的开发,在开发环境中,配置Java环境变量 修改/etc ...

  6. 通过java api统计hive库下的所有表的文件个数、文件大小

    更新hadoop fs 命令实现: [ss@db csv]$ hadoop fs -count /my_rc/my_hive_db/* 18/01/14 15:40:19 INFO hdfs.Peer ...

  7. Hive 进阶

    两种情况下不走map-reduce: 1. where ds >' ' //ds 是partition 2. select * from table //后面没有查询条件,什么都没有 1.建表 ...

  8. Hive进阶_汇总

    =========================================================================== 第2章 Hive数据的导入 使用Load语句执行 ...

  9. Hive进阶_开发Hive的自定义函数

    Hive中的自定义函数简介 (1) 在类中创建自定义函数.自定义UDF需要继承'org.apache.hadoop.hive.ql.exec.UDF',实现evaluate函数,evaluate函数支 ...

随机推荐

  1. 背包问题递归java

    public boolean PackageProblem(int[] arr,int start,int targetLeft,int target) { if(arr.length==0) { S ...

  2. JSP进阶 之 SimpleTagSupport 开发自定义标签

    绝大部分 Java 领域的 MVC 框架,例如 Struts.Spring MVC.JSF 等,主要由两部分组成:控制器组件和视图组件.其中视图组件主要由大量功能丰富的标签库充当.对于大部分开发者而言 ...

  3. HDU 1068 - Girls and Boys

    求一个集合最多几个人,其之间任意两人没有暧昧关系. 二分图匹配 最大独立集 = 总点数 - 最大匹配数 匈牙利算法 因为每个同学都在二分图的两侧 当 A与B匹配时,B与A也匹配 所以 所求的最大匹配数 ...

  4. B - Maya Calendar(第二季水)

    Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...

  5. 【Android】设备标识简介(imei imsi mac地址)

    IMEI: 1- 意义: 参考http://zh.wikipedia.org/zh-cn/IMEI  国际移动设备辨识码 ,共15位,和厂商,产地等有关. 2- 获取: 直接查看设备信息,设置-关于手 ...

  6. [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令

    1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP jmp指令要给出两种信息: (1) 转移的目的地址 (2) 转移的距离(段间转移, 段内转移, 段内近转移) 2- 依据位移进 ...

  7. 用户登录之cookie信息安全一二事

    大家都知道用户登陆后,用户信息一般会选择保存在cookie里面,因为cookie是保存客户端, 并且cookie可以在客户端用浏览器自由更改,这样将会造成用户cookie存在伪造的危险,从而可能使伪造 ...

  8. Bayesian Formulation on Cooperative Tracking

    Suppose a joint state representing a set of \(N_{n}\) nodes moving in a field\[    \textbf{X}=    \b ...

  9. 重新mysql-server

    apt-get purge mysql-server │apt-get purge mysql-common │rm -rf /var/log/mysql │rm -rf /var/log/mysql ...

  10. java 获取特定天数的时间戳

    public Timestamp strToDate(int type){ Timestamp time = null; DateFormat format2= new SimpleDateForma ...