查询员工信息:员工号、姓名、月薪、部门名称
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只支持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);
1.#hive --service hiveserver
当出现Starting Hive Thrift Server
,就证明Hive服务器端已经启动
我们有两种方式进行hive的java客户端操作:
步骤:
进入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加到环境中
同样创建一个新的文件
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的自定义函数(UDF 即 User Defined Function),可以直接应用程序于select语句,对查询结果做格式化处理后,再输出内容
1.hive> add jar /root/training/udfjar/udf_test.jar
1.hive> CREATE TEMPORARY FUNCTION <函数名> AS 'Java类名';
1.select <函数名> from table;
1.hive> DROP TEMPORARY FUNCTION <函数名>;
在文本工程下面新建一个类
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