metastore,join,udf,catalys

本文详细探讨了Hive的元数据存储机制,包括Dbs、Version、Tbls等核心概念,以及mapjoin和reducejoin的执行流程对比。同时,深入介绍了SparkSQL的执行原理与Catalyst优化,讨论了谓词下推的重要性。此外,还讲解了UDF的使用,以及如何在Hive和Spark中创建和使用自定义函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive的MetaStore信息

进入Mysql对应的database

Dbs

存的database的创建信息
在这里插入图片描述

Version

这里的数据有且仅有1条时,hive才能启动起来
在这里插入图片描述

Tbls

存表的创建信息
TBL_ID 表ID
DB_ID对应database的id
SD_ID 序列化配置信息
在这里插入图片描述

Table_params

表的具体信息
TBL_ID关联
在这里插入图片描述

Cds

在这里插入图片描述

Sds

表的压缩和格式文件存储的基本信息
通过CD_ID字段信息ID
和上表关联
在这里插入图片描述

Serdes

表的序列化方式
通过serde_id序列化类ID关联
在这里插入图片描述

Columns_v2

存表的字段信息
Interger_idx代表字段顺序,0代表表里第1个字段
在这里插入图片描述

Partitions

存分区信息
在这里插入图片描述

Partition_keys

分区的字段属性
在这里插入图片描述

Partition_key_vals

存分区的值
在这里插入图片描述
https://www.cnblogs.com/1130136248wlxk/articles/5517909.html

细谈join

假设我们做下面的sql语句

JOIN:
	select 
		e.empno,e.ename,e.deptno, d.dname
	from 
		ruoze_emp e join ruoze_dept d 
	on e.deptno=d.deptno;

mapreduce里实现

  1. a: 读取数据 <deptno,(e.empno,e.ename)>
    b: 读取数据 <deptno,(d.dname)>

  2. join,把相同key的放到一起
    <deptno,((e.empno,e.ename,e.deptno),(d.dname))>

    这个过程要shuffle,shuffle最终结果在reduce端完成,这种join通常叫Common Join/Reduce Join/Shuffle Join

执行流程

在这里插入图片描述

执行计划里有3部分内容

  1. 抽象语法树 需要在explain 后面加extended
  2. 不同stage之间的依赖关系
  3. 每个stage的描述

在Hive里查看执行计划

导入数据到emp和dept

sqoop import \
--connect jdbc:mysql://localhost:3306/ruozedb \
--username root \
--password 123456 \
--table dept \
--delete-target-dir \
--hive-import \
 --hive-table ruoze_dept \
--fields-terminated-by '\t' \
--hive-overwrite \
-m 1

默认情况下不是使用这种join,改下参数

hive (default)> set hive.auto.convert.join;
hive.auto.convert.join=true

hive (default)> set hive.auto.convert.join = false;
hive (default)> set hive.auto.convert.join;
hive.auto.convert.join=false

执行计划语句
Explain
select a.empno,a.ename,a.deptno, d.dname
from ruoze_emp a join ruoze_dept d
on a.deptno=d.deptno;

输出
在这里插入图片描述在这里插入图片描述在这里插入图片描述

Map结束后reduce
在这里插入图片描述
结果输出
在这里插入图片描述

mapjoin

执行流程
在这里插入图片描述
MR Local Task 把小表数据读进来,生成一个HashTable Files,加载文件到Distribbute cache(分布式缓存)

TaskB读大表数据,和小表的数据做匹配,匹配的上就留,匹配不上就走。

执行计划

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

看hashtable

直接执行代码,看日志

select a.empno,a.ename,a.deptno, d.dname
from ruoze_emp a join ruoze_dept d 
on a.deptno=d.deptno;

在这里插入图片描述没有reducer,说明没有reducejoin,没有shuffle和reduce.
没有shuffle就没有reduce,因为数据归约在map阶段就做了,并且直接输出到文件
在这里插入图片描述

这样写也可以

Explain
select /*+ MAPJOIN(d) */
a.empno,a.ename,a.deptno, d.dname
from ruoze_emp a join ruoze_dept d 
on a.deptno=d.deptno;

UDF 用户定义函数

UDF  一进一出 upper,lower
UDAF 多进一出 sum,map
UDTF 一进多出  lateral view explode

查看内置函数
hive (default)> show functions;

Pom.xml添加hive依赖

<hive.version>1.1.0-cdh5.7.0</hive.version>
<dependency>
  <groupId>org.appche.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>${hive.version}</version>
</dependency>

在Hive里,创建临时函数

Add jar /home/hadoop/data/g5-spark-1.0.jar;

create temporary function ruoze_welcome as 'com.ruozedata.bigdata.sql05.ruozeUDF';

在这里插入图片描述
临时函数生命周期只在当前窗口有效
在这里插入图片描述

关掉hive
在hive目录下创建一个文件夹用来放jar包
在这里插入图片描述

这样的话,启动hive,不需要add了
在这里插入图片描述

永久函数

就是把函数注册到metastore

现在
在这里插入图片描述

先把jar包放到hdfs上

[hadoop@hadoop000 data]$ hadoop fs -put g5-spark-1.0.jar /lib/ g5-spark-1.0.jar

然后hive里

create function ruoze_hello as 'com.ruozedata.bigdata.sql05.ruozeUDF'  using jar 'hdfs://hadoop000:9000/lib/g5-spark-1.0.jar';

metastore已有在这里插入图片描述

Sparksql执行底层与catalys优化

在这里插入图片描述
在这里插入图片描述
假如执行下面语句
在这里插入图片描述

表达式就是一个基于输入值就算出来的东东,比如sum和v
在这里插入图片描述

逻辑执行计划,只是规化,但不计算
在这里插入图片描述

物理执行计划
明确如何计算
在这里插入图片描述

1+2明显是常量,不需要每次都重新计算,计算一次即可
在这里插入图片描述

如果遇到两个int类型,直接相加
在这里插入图片描述

谓词下压

过滤完再join,数据更少,更快

我们知道,可以通过封装SparkSql的Data Source API完成各类数据源的查询,那么如果底层数据源无法高效完成数据的过滤,就会执行直接的全局扫描,把每条相关的数据都交给SparkSql的Filter操作符完成过滤,虽然SparkSql使用的Code Generation技术极大的提高了数据过滤的效率,但是这个过程无法避免大量数据的磁盘读取,甚至在某些情况下会涉及网络IO(例如数据非本地化时);如果底层数据源在进行扫描时能非常快速的完成数据的过滤,那么就会把过滤交给底层数据源来完成,这就是SparkSql中的谓词下推。
在这里插入图片描述

常量计算一次转换
在这里插入图片描述

提前列裁剪
在这里插入图片描述

综合起来就是这样

在这里插入图片描述

在sql里查看执行计划

Sql语句后面加个 .explain或者.explain(true)
前者只有物理,后者有逻辑执行计划

### 部署 Stable Diffusion 的准备工作 为了成功部署 Stable Diffusion,在本地环境中需完成几个关键准备事项。确保安装了 Python 和 Git 工具,因为这些对于获取源码和管理依赖项至关重要。 #### 安装必要的软件包和支持库 建议创建一个新的虚拟环境来隔离项目的依赖关系。这可以通过 Anaconda 或者 venv 实现: ```bash conda create -n sd python=3.9 conda activate sd ``` 或者使用 `venv`: ```bash python -m venv sd-env source sd-env/bin/activate # Unix or macOS sd-env\Scripts\activate # Windows ``` ### 下载预训练模型 Stable Diffusion 要求有预先训练好的模型权重文件以便能够正常工作。可以从官方资源或者其他可信赖的地方获得这些权重文件[^2]。 ### 获取并配置项目代码 接着要做的就是把最新的 Stable Diffusion WebUI 版本拉取下来。在命令行工具里执行如下指令可以实现这一点;这里假设目标路径为桌面下的特定位置[^3]: ```bash git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git ~/Desktop/stable-diffusion-webui cd ~/Desktop/stable-diffusion-webui ``` ### 设置 GPU 支持 (如果适用) 当打算利用 NVIDIA 显卡加速推理速度时,则需要确认 PyTorch 及 CUDA 是否已经正确设置好。下面这段简单的测试脚本可以帮助验证这一情况[^4]: ```python import torch print(f"Torch version: {torch.__version__}") if torch.cuda.is_available(): print("CUDA is available!") else: print("No CUDA detected.") ``` 一旦上述步骤都顺利完成之后,就可以按照具体文档中的指导进一步操作,比如调整参数、启动服务端口等等。整个过程中遇到任何疑问都可以查阅相关资料或社区支持寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值