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. C#调用SAPWebService

    其实和调用其它WebService 没有很大不同  只是不了解SAP的人 可能不太明白 SAP接口中的相关参数 //调用接口 , 创建对象 ServiceReference1.Z_IF_MM_VEND ...

  2. HDU 2510 - 符号三角形

    DFS后打表 #include <iostream> using namespace std; ,,,,,,,,,,,,,,,,,,,,,,,,}; int main() { int n; ...

  3. 奇葩问题:spring+mybaits项目突然出现其中一些Mapper类找不到

    一.问题现象 1,No bean named 'bomManageMapper' found in org.springframework.beans.factory.support.DefaultL ...

  4. 京东UED招聘web前端开发工程师(中/高级)

    工作职责: 负责前端界面的构建和各类交互设计与实现: 前端样式和脚本的模块设计及优化: 协同后台开发人员完成项目: 负责新产品开发线前端工作(新产品.垂直站.移动端 .后端系统),可根据个人喜好及特长 ...

  5. CSS 总结

    CSS 积累总结 1. ::Selection 选择器 使被选中的文本成为灰色: ::selection { color:#CCC; background:red; --- 选中背景颜色变成红色 } ...

  6. A Knight's Journey 分类: dfs 2015-05-03 14:51 23人阅读 评论(0) 收藏

    A Knight’s Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 34085 Accepted: 11621 ...

  7. 【POJ 1182 食物链】并查集

    此题按照<挑战程序设计竞赛(第2版)>P89的解法,不容易想到,但想清楚了代码还是比较直观的. 并查集模板(包含了记录高度的rank数组和查询时状态压缩) *; int par[MAX_N ...

  8. jquery promot

    http://www.itivy.com/jquery/archive/2011/10/15/jquery-impromptu-usage.html

  9. jQuery提交form表单

    <form id="search_form" name="search_form" method="post"> <inp ...

  10. _itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; }

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVveW91MTMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...