【大数据离线开发】8.4 Hive的查询、操作以及自定义函数
创始人
2024-05-29 18:52:04
0

8.5 Hive的查询

执行SQL(HQL)。HQL是SQL的一个子集

案例:创建部门表,对数据进行查询

创建部门表
create table deptno(deptno int,dname string,loc string
)
row format delimited fileds terminated by ',';导入数据
load data local inpath '/root/temp/dept.csv' into table dept;

8.5.1 简单查询

查询所有的员工信息
select * from emp1;

8.5.2 过滤和排序

查询员工信息:员工号  姓名  薪水
select empno,ename,sal,deptno from emp1;

8.5.3 多表查询

查询部门名称、员工的姓名select dept.dname,emp1.ename		from emp1,deptwhere emp1.deptno=dept.deptno;

8.5.4 子查询

子查询:hive只支持:from和where后面的子查询查询部门名称是SALES的员工信息
select * 
from emp1
where emp1.deptno in (select deptno from dept where dname='SALES');

在这里插入图片描述

8.5.5 Hive的函数

内置函数:select max(sal) from emp1;
  • 数学函数

    • round
    • ceil
    • floor
  • 字符函数

    • lower

    • upper

    • length

    • concat

    • substr

    • trim

    • lpad

    • rpad

  • 收集函数

    • size
  • 日期函数

    • to_date

    • year

    • month

    • day

    • weekofyear

    • datediff

    • date_add

    • date_sub

  • 条件函数

    • if
    • coalesce
    • case… when…
  • 聚合函数

    • count
    • sum
    • min
    • max
    • avg

8.5.6 条件函数

条件函数(条件表达式:就是一个if else语句)
if
coalesce
case… when…

需求:做一个报表:涨工资,总裁1000 经理800 其他400

select empno,ename,job,sal,case job when 'PRESIDENT' then sal+1000when 'MANAGER'   then sal+800else sal+400end
from emp1;Oracle数据库:decode函数也是条件函数
select empno,ename,job,sal "Before"decode(job,'PRESIDENT', sal+1000,'MANAGER', sal+800,sal+400) "After"
from emp;

在这里插入图片描述

8.6 Hive的Java API

准备工作

  1. 首先启动Hive远程服务:hiveserver2 &
  2. 需要Hive lib目录下的jar包

TestMain.java

package demo.jdbc;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;public class TestMain {public static void main(String[] args) {String sql = "select * from mytest1";Connection conn = null;Statement st = null;ResultSet rs = null;try{//获取链接conn = JDBCUtils.getConnection();//得到运行环境st = conn.createStatement();//运行SQLrs = st.executeQuery(sql);//处理while(rs.next()){//取员工姓名, 不能通过列名来取,通过序号int id = rs.getInt("tid");String name = rs.getString("tname");System.out.println(id+"\t"+name);}}catch(Exception ex){ex.printStackTrace();}finally{//释放资源JDBCUtils.release(conn, st, rs);}}}

JDBCUtils.java

package demo.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/** 工具类:* 1、获取数据库Hive链接* 2、释放资源*/
public class JDBCUtils {//Hive数据库的驱动private static String driver = "org.apache.hive.jdbc.HiveDriver";                                //Hive位置private static String url = "jdbc:hive2://192.168.157.111:10000/default";//注册驱动static{try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();throw new ExceptionInInitializerError(e);}}//获取链接public static Connection getConnection(){try {return DriverManager.getConnection(url);} catch (SQLException e) {e.printStackTrace();}return null;}public static void release(Connection conn,Statement st,ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if(st != null){try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}
}

1、JDBC:Java的标准的访问数据库的接口

启动Hive Server: hiveserver2

java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException:User:
root is not allowed to impersonate anonymous
在老版本的Hive中,是没有这个问题的
把Hadoop HDFS的访问用户(代理用户) —> *

core-site.xmlhadoop.proxyuser.root.hosts*hadoop.proxyuser.root.groups*	

2、ODBC、Thrift Client

8.7 Hive的自定义函数

  • Hive的自定义函数(UDF:user define function)本质就是一个Java程序

    • 可以直接应用于select语句,对查询结构做格式化处理后,再输出内容
  • Hive自定义函数的实现细节

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

Hive自定义函数案例

案例一:拼接两个字符串

1、实现关系型数据库中的concat函数: 拼加字符串
select concat('Hello  ' ,'World') from dual;  ----> Hello World

在这里插入图片描述

案例二:判断员工表中工资的级别

2、根据员工的薪水,判断薪水的级别(*) sal < 1000   ---> Grade A(*) 1000<= sal < 3000 ---> Grade B(*) sal >= 3000 ---> Grade C

在这里插入图片描述

Hive自定义函数的部署

将程序打包放到目标机器上去
将jar包加入hive的classpath
add jar /root/temp/myudf.jar;创建临时函数别名(函数名称)
create temporary function myconcat as 'udf.MyConcatString';
create temporary function checksal as 'udf.CheckSalaryGrade';

在这里插入图片描述

在这里插入图片描述

Hive自定义函数的调用

查询HQL语句:
select myconcat(ename,job) from emp;
select ename,sal,checksalary(sal) from emp;销毁临时函数:
DROP TEMPORARY FUNCTION checksalary;

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...