码迷,mamicode.com
首页 > 其他好文 > 详细

Hive进阶(下)

时间:2016-01-23 00:51:36      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

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 <函数名> ASJava类名‘;
  • 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进阶(下)

标签:

原文地址:http://www.cnblogs.com/XBlack/p/5152551.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!