【大数据离线开发】8.4 Hive的查询、操作以及自定义函数

news2024/11/25 11:25:13

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,dept
	where emp1.deptno=dept.deptno;

8.5.4 子查询

子查询:hive只支持:fromwhere后面的子查询

查询部门名称是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+1000
         	when 'MANAGER'   then sal+800
			else sal+400
	end
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();
			
			//运行SQL
			rs = 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.xml
	<property>
		 <name>hadoop.proxyuser.root.hosts</name>
		 <value>*</value>
	</property>

	<property>
		 <name>hadoop.proxyuser.root.groups</name>
		 <value>*</value>
	</property>	

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;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

函数式编程:Lambda 表达式

函数式编程&#xff1a;Lambda 表达式 每博一文案 曾经读过的依然令我感动的句子&#xff0c;生活总是不如意&#xff0c;但往往是在无数痛苦中&#xff0c;但往往是在无数痛苦中&#xff0c;在重重矛盾 和艰难中才能成熟起来&#xff0c;坚强起来&#xff0c;爱情啊&#xf…

JMeter 控制并发数

文章目录一、误区二、正确设置 JMeter 的并发数总结没用过 JMeter 的同学&#xff0c;可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/details/118875293?spm1001.2014.3001.5501 一、误区 在使用 JMeter 做压测时&#xff0c;大家都知道要这么…

又拍云邵海杨 - 25年Linux老兵,聊聊运维的“术”与“道”

您好邵总&#xff0c;请您先做个自我介绍吧&#xff0c;聊聊您的履历和现状&#xff0c;让大家更好的认识您&#xff0c;了解您的背景也有助于读者理解后面的采访内容 我是来自又拍云的邵海杨&#xff0c;从1998年开始使用Linux至今快25年了&#xff0c;资深(老鸟)Linux系统运维…

Log Structure Merge Tree

LSM是一种基于日志追加写的数据结构&#xff0c;非常适合为具有高写入数据提供索引访问 LSM基于以下前提 内存读写速度远高于磁盘&#xff0c;但内存有限磁盘顺序读写速度远高于随机读写 结构 WAL WAL(write-ahead log)是用于在系统错误时提供持久化&#xff0c;在写入数据…

SpringBoot自动装配原理、条件注解及封装Starter

1.什么是 SpringBoot 自动装配&#xff1f; 我们现在提到自动装配的时候&#xff0c;一般会和Spring Boot联系在一起。但是实际上SpringFramework 早就实现了这个功能。Spring Boot 只是在其基础上&#xff0c;通过 SPI 的方式&#xff0c;做了进一步优化。 SpringBoot 定义了…

C++之string字符串不同类型间转换

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C实战宝典 &#x1f332;上一篇: VS2019加载解决方案时不能自动打开之前的文档&#xff08…

pytorch 笔记:torch.fft

1 FFT 进行一个维度的快速傅里叶变换 torch.fft.fft(input, nNone, dim- 1, normNone, *, outNone) 1.1 主要参数 input输入&#xff0c;需要傅里叶变换的tensorn 需要变换的tensor的长度&#xff0c;默认是input的长度 如果比input长度大&#xff0c;那么补0如果比input长度…

乐山持点科技:抖音极速版电商入驻指南

“抖音极速版电商”拥有海量活跃用户&#xff0c;着眼下沉市场&#xff0c;为消费者带来高性价比产业带源头好货。针对中小商家设立更宽松的经营要求、提供简单易上手的经营工具&#xff0c;助力商家轻松经营&#xff01;来看入驻指南&#xff1a;一、抖音与抖音极速版电商入驻…

JavaScript基础五、语句

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

float的表示范围为什么比long大

●很多人会有一个疑问, 一个用来表示小数的 float 为什么表示的范围会比 long 还要大呢 ? ●这次, 咱们就来详细说一说这个事情 从长计议 ●聊到这个话题, 我们就要从计算机存储数字这个位置说起了 ●计算机存储数字的方式其实就是 : 二进制 二进制是计算机中最基本的数字存储…

Java学习笔记 --- jQuery

一、jQuery介绍 jQuery&#xff0c;顾名思义&#xff0c;也就是JavaScript和查询&#xff08;Query&#xff09;&#xff0c;它就是辅助JavaScript开发的js类库。它的核心思想是write less&#xff0c;do more&#xff08;写得更少&#xff0c;做得更多&#xff09;&#xff0c…

2023王道考研数据结构笔记第五章——树

第五章 树 5.1 树的基本概念 树是n&#xff08;n≥0&#xff09;个结点的有限集合&#xff0c;n 0时&#xff0c;称为空树。 空树——结点数为0的树 非空树——①有且仅有一个根节点 ​ ②没有后继的结点称为“叶子结点”&#xff08;或终端结点&#xff09; ​ ③有后继的结…

webStorm svn不显示的问题

看图就行了&#xff0c;怎么下载安装我就不说了&#xff0c;网上一搜全是

<JVM上篇:内存与垃圾回收篇>13 - 垃圾回收器

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录13.1. GC 分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估 GC 的性能指标13.2. 不同的垃圾回收器概述13.…

JavaScript基础一、简介

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

1.认识网络爬虫

1.认识网络爬虫网络爬虫爬虫的合法性HTTP协议请求与响应(重点)网络爬虫 爬虫的全名叫网络爬虫&#xff0c;简称爬虫。他还有其他的名字&#xff0c;比如网络机器人&#xff0c;网络蜘蛛等等。爬虫就好像一个探测机器&#xff0c;它的基本操作就是模拟人的行为去各个网站溜达&am…

Modbus转profinet网关连接Smart PLC与ABB变频器实现Modbus通信

本案例讲述了modbus转profinet网关&#xff0c;在系统改造中把ABB变频器接入到Smart PLC的Profinet总线上&#xff0c;PLC不用编程实现Profinet转modbus的协议互转&#xff0c;并且SmartPLC485口连接触摸屏采集数据&#xff0c;完成对变频器读写控制 网络拓展图如下图所示&…

达梦数据库运行内存参数配置学习笔记

一、设置运行中的数据库参数 SP_SET_PARA_VALUE(2,MAX_SESSIONS,500) 设置数据库运行参数&#xff0c;参数为 1 表示获取 INI 文件中配置参数的值&#xff0c;为 2 表示获取内存中配置参数的值 二、修改dm.ini数据库运行参数文件&#xff0c;重启数据库 不能动态修改dm.ini参数…

【k8s】安装dashboard以及报错处理

安装步骤&#xff1a; 点击进入dashboard 的 GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clustershttps://github.com/kubernetes/dashboard 查看当前k8s版本对应的dashboard版本&#xff0c;点击右边releases 执行对应版本指令安装(我的k8s是v…

近自由电子近似

假设 potential 的变化是非常小的 我们可以找到一条平均线 代表的就是我们的平均值 这样我们用原来的 就可以得到一个 和平均的这条线相比&#xff0c;上下变化不大&#xff0c;这个对我们薛定谔方程求解能带来很大的便利 我们就可以得到一个平均势场 这样的话&#xff0c;…