Hive进阶(下)
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只支持from和where子句中的子查询
主查询和子查询可以不是同一张表
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客户端操作
步骤:
- 获取连接
- 创建运行环境
- 执行HQL
- 处理结果
- 释放资源
进入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进阶(下)的更多相关文章
- Hive进阶(上)
Hive进阶(上) Hive进阶(上) 执行数据导入 使用Load语句 语法: 1.LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- Docker入门与进阶(下)
Docker入门与进阶(下) 作者 刘畅 时间 2020-11-12 实验主机配置 系统centos7.5 主机名 ip 配置 应用 harbor-master 172.16.1.71 2核4G/60 ...
- Spark入门实战系列--5.Hive(下)--Hive实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步 启动HDFS ...
- Hive学习之六 《Hive进阶— —hive jdbc》 详解
接Hive学习五 http://www.cnblogs.com/invban/p/5331159.html 一.配置环境变量 hive jdbc的开发,在开发环境中,配置Java环境变量 修改/etc ...
- 通过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 ...
- Hive 进阶
两种情况下不走map-reduce: 1. where ds >' ' //ds 是partition 2. select * from table //后面没有查询条件,什么都没有 1.建表 ...
- Hive进阶_汇总
=========================================================================== 第2章 Hive数据的导入 使用Load语句执行 ...
- Hive进阶_开发Hive的自定义函数
Hive中的自定义函数简介 (1) 在类中创建自定义函数.自定义UDF需要继承'org.apache.hadoop.hive.ql.exec.UDF',实现evaluate函数,evaluate函数支 ...
随机推荐
- NSArray数组的学习总结
1.不可变数组NSArray NSArray是不可变的,而且只能储存Object-c对象.另外,数组的最后一个元素一定是nil,表示结束. 注:这些集合类只能收集cocoa对象(NSOjbect对象) ...
- C#操作AD的例子
一下连接中包含了使用c#对AD操作的各种列子 http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-D ...
- Java 基础之 static 静态
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- oracle recyclebin详解(闪回删除的表)
今天在SOA应用数据库上运用DBMS_REDEFITION包进行在线非分区表转换分区表操作时,本想DROP掉建的临时表cube_scope_temp不小心后面忘记加"temp"直接 ...
- JQuery动态表格
功能实现:点击添加按钮,表格增加一行并给其name属性赋予的值,方便获取 点击删除,自动删除这一行 JQuery中定义一个count变量 var count = 1; function add() { ...
- javascript中可处理的浮点数的最高精度(和小数的一些小特性)
1.之前在度娘那找了一下关于javascript中可处理的浮点数的最高精度的问题,但找了好久也找不到,于是自己 小小的研究了一下,之前以为是17,后来测到18,再后来又测到19,经过一系列的改写,得到 ...
- VSFTP服务
互联网最开始的三大服务:HTTP.mail.FTP 一.文件服务器简介 FTP:在内网和公网使用.服务器:windows,Linux 客户端:windows,Linux samb ...
- Android动画的深入分析
一.AnimationDrawable的使用 详见:Drawable类及XMLDrawable的使用 补充:通过Animation的setAnimationListener()可以给View动画添加监 ...
- 中国大学MOOC-翁恺-C语言程序设计习题集
今年网易出了“中国大学MOOC”,于是选了浙大翁恺老师的“C语言程序设计”学习,近期打算把自己在该课程中的PAT习题解答做一个记录,等自己编程能力提高后再来看现在写的代码哪里还有写的不好,可以改进的地 ...
- 在类似qq或者微信聊天中。如何根据不同的手机发送图片
原文:在类似qq或者微信聊天中.如何根据不同的手机发送图片 前一段时间,公司自己要求做多客服开发,但是对于发送图片这一块,当时很苦恼,我用自己的手机(米2)测试,不管是本地,还是云相册,最新照片. ...