Hive详解、配置、数据结构、Hive CLI

一、Hive 认识

1. Hive 应用
问题:公司的经营状况?
主题一:财务现金流指标1.1:净现金流入/流出量指标1.2:现金转换周期预算执行状况指标2.1:预算内成本控制指标2.2:预算与实际支出的差异
主题二:产品指标1:产品销售量指标2:产品利润率指标3:新产品开发周期
主题三:客户老客户的流失率指标1.1:重复购买率指标1.2:客户满意度调查结果新客户的留存率、转化率指标2.1:新客户留存率指标2.2:潜在客户到实际客户的转化率
主题四:员工指标1:员工满意度指标2:员工流失率指标3:员工绩效评估
主题五:资产指标1:资产负债率指标2:固定资产周转率指标3:存货周转率

问题 => 主题(拆分) => 指标 => HQL

2. Hive 定义

基于元数据表数据对数据进行结构化治理的机制(数仓)
在这里插入图片描述
"基于元数据"的核心:获取Hive MetaStore指定Mysql存储的元数据并根据其解析HQL生成执行计划
"基于表数据"的核心:获取表数据并通过执行计划进行数据处理和结果存储和加载。

3. Hive 具体设计

在这里插入图片描述

关键组件

UI:客户端提交查询。
Compiler:借助MetaStore获取存储在Mysql中的元数据信息解析查询块或表达式,生成执行计划。
Execution engine:管理计划的不同阶段之间的依赖关系(协调各操作的执行顺序),并在适当的大数据组件上执行这些阶段。

关键步骤详解

6.1步:
1.将执行计划提交到Hadoop作为一个MapReduce作业.
2.RM将作业分解为多个任务,并且分配给不同的集群节点去执行。
3.启动Map任务(读取输入数据,处理,输出结果)
4.启动Reduce任务(可选)(读取Map|Shffle端输出,处理,输出结果) => 决定了是MapOnly引擎还是MapReduce引擎
6.2步:
完成了一个Job,将数据加载到Hive表上。
6.3步:
Hive与HDFS进行交互,包括读取数据文件以进行查询,或将查询结果写入到HDFS。
7,8,9步:
一旦执行引擎完成了查询任务,结果需要被传回UI
体现了将查询结果有执行引擎处理并通过Hive驱动程序返回给用户界面的过程。

执行计划的变化过程

在这里插入图片描述

二、ETL——数仓构建核心环节

定义

将数据从各种数据源中提取出来,经过一系列处理和转换,最后导入到Hive委托存储的地方(例如:HDFS,Mysql等)

详解
Extract
​			从外部数据源读取不同数据格式(结构化,半结构化,非结构化)数据通过UI提交到Hive系统
​		ODS 近源层
​			Extract后提取到的保持原始格式的数据被提取到ODS层,并在ODS层内经过一定的清洗和结构化。
​		==================进入MapReduce框架=====================
​		Transform(+宽表)									
​			列裁剪:使用 INSERT INTO ... SELECT 语句创建新表或视图。			
​			数据清洗:移除无用或错误数据。									
​			数据补全:修正残缺或错误数据。如 mlae 视为 male。				province  city					
​			数据变形:改变数据的格式。如 {province:Jiangsu, city:wuxi} 转为 Jiangsu | wuxi。										
​			无法修正错误:删除记录或视为缺失后估算。如年龄 -3。	
​		数据集大小对处理要求的影响
​			大数据集:尽量近似和估算
​			小数据集:尽量补全		
​		
​		DWD 明细层
​			存储原始或未加工的数据
​			数据分析示例
​			事实->维度->维度建模
​			事实:如 “我在12:13分在小A包子店吃了一个鲜肉包。”
​			维度建模:基于不同客体分析,如对用户,则有特征,身份,喜好...
​										  对鲜肉包,则有销量,销量占比,材料,烹饪方式...
​		DWT	轻聚层
​			对数据进行不同维度和不同量级的聚合,便于对数据进行即时查询
​			DWS 汇总层数据被进一步聚合和汇总DM 	数据集市数据仓库架构中的业务数据仓库子集,通常针对特定业务部门或功能领域。Load1. 将数据从DM层或者直接从源头加载到HDFS中。2. 将物理计划传递给执行引擎,如MapReduce。3. 获取处理后的结果或将处理后的结果写入HDFS。关于"层"的概念:1. "层"是逻辑概念,表示一个数据处理|存储环节,实际上存储在不同的服务器中。2. "层"是基于数仓的概念,不依赖于任何引擎。

三、Hive 数据结构

(一)简介

1.存储位置

库、表的存储位置:

/user/hive/warehouse【即配置hive.metastore.warehouse.dir的文件夹路径地址】

默认数据库default非default数据库
数据库位置/user/hive/warehouse/数据库名字.db
表位置/user/hive/warehouse/表名/user/hive/warehouse/数据库名字.db/表名
2.类型

在这里插入图片描述
数据的存储位置:

服务Hive MetaStore:指定Derby|Mysql存储元数据信息,并与HDFS相关联。开放API面向客户端供它们访问元数据信息。			
存储database_params:存放元数据参数配置dbs:存放metadata元数据

(二)各数据类型详解

1.库:文件夹
2.表:文件夹
命名

内部表:hive_+含义
外部表:hive_ext_+含义
CTE|TEMPORARY TABLE|VIEW:含义|hive_tmp_+含义|hive_view_+含义
分区表|分桶表:hive_par_+含义

内部表与外部表

A.区别

内部表
​	1.HDFS中的数据由Hive管理,在Hive中删除表会同步删除数据。
​	2.在Hive中创建内部表之后,在HDFS中会自动创建内部映射路径:/hive312/warehouse/DB_NAME.db/TABLE_NAME
​	3.内部表在创建的时候,通常路径中还没有数据。
外部表
​	1.HDFS中的数据不由Hive管理,在Hive中删除表不会同步删除数据,要删数据必须去HDFS中手动删除。
​	2.在Hive中创建外部表之后,在HDFS中不会有内部映射路径,需要自行创建并指定location。(location为数据文件的上一级目录)
​	3.外部表在创建的时候,通常路径中已有数据。

B.选择
只在Hive中使用;频繁更新数据并希望这些操作自动管理 —— 内部表
数据由多个应用共享,例如Hive和Spark;数据不经常变化或数据更新由外部过程管理 —— 外部表

3.分区:文件夹
定义

分区字段名=分区字段值
基于一个或多个分区键进行分区,通常以日期进行分区。
分区表为内部表。
分区字段可以是原始表中的字段,也可以是通过表中的一个或多个字段计算出来的表达式。(日期 -> 年)。
若非原始字段,其本身也可以作为原始字段使用所有的SQL语句。

如何选用分区字段?

1.WHERE … | ON …
2.GROUP BY … , DISTRIBUTE BY … (确定Reducer) , cluster by …(确定Reducer并在内部排序)
3.如果数据量大,由于分区本身(文件夹)的大小限制,会选择缩小分区字段的维度。

分类

1.静态分区(eg:客户按分区给数据)
需要为每个加载的数据集指定一个具体的分区(分区字段名=字段值)
适用于持续增长的新数据,例如对按月分区的数据,每个月增加一次分区即可。

2.动态分区(eg:项目初期,客户一次性给了大量数据)
适合处理包含大量分区的情况

作用

1.hive进行查询时就是文件流读文件,即使读一条数据也需要加载整个文件。
所以分区表将文件切割成更小的粒度,当需要针对局部数据进行检索、聚合等处理时,便于快速筛选出符合特定条件的数据,提高效率。
2.如果需要进行分组聚合的字段是分组字段,即直接对该分区作聚合,则直接设置combiner,无需设置reducer。

多级分区
GROUP BY year(order_time),month(order_time),weekofmonth(order_time)=>从左到右分区从主到次
一级分区(year=2012)二级分区(month=3)三级分区(weekofmonth=2)
4.分桶:文件
定义

选择桶中的一个或多个列作为桶的依据,根据这些列的值对数据进行散列,然后根据散列值将数据分配到不同的桶中。
​ 分桶的字段必须是表中已存在的字段,分桶数通常为2^n
​ 默认采用原始字段值的hashcode%分桶数来决定该行数据会被拆分到几个桶。

目的

便于进行抽样,通过了解数据的分布状态来对数据进行全量分析。或者作为一部分数据集运行查询测试。
​ 提升有join操作时的MR效率

如何确定分桶数量?

主要由采样率决定 : 10% -> 桶数定义为10
​ 数据量越大,分桶越多。分桶越多,并行度越高。
​ 分区倾斜严重,分桶能缓解。

四、Hive的配置与优化

配置:											优先级			重要程度
set config_item=value;	临时配置			  1				✔✔✔(个性化 执行优化)set hive.server2.logging.operation.level=verbose|NONE; 开启|关闭日志(🔺)
hive-site.xml			自定义配置			  2				  ✔(服务 通用优化配置)取hive-default.xml的头结构并且按hive_install.md进行个性化配置。
hive-default.xml		默认配置(模板)		  3优化:
Cost based Optimizer
1.通过估算不同查询策略的成本来选择执行计划,根据数据库中数据的变化动态调整计划。
2.在执行多表连接的查询时,会找出最优的连接顺序和连接算法.

五、Hive CLI

1.启用 CLI
HiveServer2 BeelineHiveServer1 CLI
Connectionbeeline -u <jdbcurl> beeline -u jdbc:hive2://localhost:10000hive -h <hostname> -p <port> hive
Querybeeline -e <query\ in quote> beeline -f <query\ file name>hive -e <query\ in quote> hive -f <query\ file name>

注意:beeline -u输入的所有SQL语句前面不能有空白符。
beeline -u 刚开始连接上的时候会因为Hadoop的安全模式或者服务的延迟 导致开始可能会连接不上。
hive -e 适用于编写处理Hive的脚本,因为可以做临时连接(添加|删除分区…)

2.基本命令
!table					List Tables
!column <table_name>	List Columns
!sh ls					Run Shell CMD
dfs -ls ;				Run DFS CMD
!run <file_name>		Run SQL File
!dbinfo					Check Supports
3.数据类型(用于解析数据)
基础类型([]为较Mysql多出的)字符:char,varchar,[string]✔整数:tinyint,smallint,int✔,bigint小数:float,double,numeric(m,n),decimal(m,n)✔布尔:[boolean]✔日期:date✔(YYYY-mm-dd 必须完整),timestamp(ms为单位,也可解析具体到秒的日期和时间信息:2015-9-7 1:52:22)✔
复杂类型(支持泛型)数组:array<T> => 用于处理同类型数据,对原始数据做结构化映射的(先升维才方便降维)键值对:map<K,V> => 用于处理有稳定映射关系的数据结构体:struct<n1:T1,n2:T2,...> => 用于处理无稳定映射关系的数据一般来说,键值对or结构体的键尽量简单,值可以有一定的复杂度。
嵌套复杂类型数组结构体array<struct<name:STRING,age:INT>> => [{"name": "Alice", "age": 30},{"name": "Bob", "age": 25},{"name": "Charlie", "age": 35}]
特殊:01 => string(若设置为int,会自动去除前导零)2015-01 => date ❌(不完整) timestamp ❌(没有具体到秒) string ✔
4. 数据库
show databases;
create datebase if not exists yb12211;
use yb12211;
describe database yb12211;
alter database yb12211 set owner user dayongd;
drop datebase if exists yb12211;
5.数据表
A.建表操作
mkdir -p EXTERNAL_TABLE_DIR
hdfs dfs -put FILE_NAME EXTERNAL_TABLE_DIR
create [external] table if not exists TABLE_NAME(id int,name string,time bigint,isPartyMember boolean,expectSalary decimal(10,2),hobby array<string>,scores map<string,int>,address struct<province:string,city:string>
)
comment 'TABLE_USAGE'
PARTITIONED BY (partition_key STRING)
---	row format delimited
|		fields terminated by ','				字段分隔方式
|		collection items terminated by ';'		集合项分隔方式
|		map keys terminated by ':'				键值对分隔方式
|		lines terminated by '\n'				行间分隔方式(还可能有'\r\n','\t',' '...)
|	
---	row format serde 'CLASS_FULL_PATH'CSV(123,张三,1698376651212,true,26238.45)serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'with serdeproperties(separatorChar=',',quoteChar='"',(用于包围数据字段,避免数据内的符号被视为分隔符)escapeChar='\\'(规避处理转义符))regexserde 'org.apache.hadoop.hive.serde2.RegexSerDe'with serdeproperties('input.regex'='^(\\d+),(.*?),(\\d+),(true|false),(\\d+).(\\d+\.?\\d+?)$')jsonserde 'org.apache.hive.hcatalog.data.JsonSerDe'hbaseserde 'org.apache.hadoop.hive.hbase.HBaseSerde'stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'with sederproperties("hbase.columns.mapping"=":key,info:name,info:sex,info:age")tblproperties("hbase.table.name"="test_serde");stored as FILE_FORMAT(textfile|orc|parquet|sequencefile|JSONFile|CSV)	指定存储格式,文件的存储格式改变,可能要相应设置InputFormat和OutputFormat。
location 'EXTERNAL_TABLE_DIR'
tblproperties('skip.header.line.count'='1''skip.footer.line.count'='2''related_sql_table' = 'my_sql_table'	将Hive表与另一个数据库的表`my_sql_table`相关联
);
load data [local] inpath 'FILEDIR' [overwrite] into table DB_NAME.TABLE_NAME;
行格式的用法
delimited:以特定分隔符分隔的数据,可处理复杂数据"123 Main St,Anytown,12345""math:90,science:85,english:95"
Serde:不得已才用OpenCSVSerde:可以很好地处理包含引号和逗号的复杂 CSV 数据不支持数据中有复杂的数据结构"Jane Doe","[email protected]","555-1234","Street 123, Some City"记忆:CSV格式要求表头(可选)CSV文件通常由多行组成,每行代表一个数据记录,字段内容可以包含在引号中(尤其是当字段值中包含分隔符时)字段之间通常用,进行分隔,行之间通常用换行符进行分隔RegexSerDe:适用于非标准或更复杂的文本数据格式和数据行中有较多无用数据的情况,通常面向日志"[INFO] 2023-11-15 09:00:00 - Task started"JsonSerDe:处理	json 格式的数据{"id": 2, "name": "Bob", "role": "Analyst", "salary": 50000}记忆:JSON格式要求键值对形式 + 字符串需用双引号括起来 + 逗号分隔
ROW FORMAT 便于对不同类型的数据进行建表,在采集数据到ODS的过程中发挥作用
LOAD上传的文件类型不重要LOCAL:有LOCAL表示文件位于Linux本地,执行后为拷贝数据没有LOCAL表示文件位于HDFS中,执行后为直接移动数据OVERWRITE:有OVERWRITE表示覆盖没有OVERWRITE表示追加LOAD DATA和LOCATION的区别
LOAD DATA:在hive312的目录下,将数据从文件系统(本地|HDFS)直接加载到Hive表中LOCAL INPATH	复制INPATH			移动
LOCATION:用于指定表的数据实际存储在哪个文件系统路径上LOCAL INPATH 选择复制数据的原因是为了在本地文件系统下留存一份数据副本
INPATH 选择移动数据的原因是在HDFS中移动数据只设计元数据的更改,并且不涉及网络传输,效率更高。
常见函数
​split("...",'SEPERATOR')				分隔
regexp_replace("...",'REGEX','REPLACE')	正则替换
​explode(...)							列转行
先建表,再插入数据
INSERT INTO TABLE_NAME(FIELD1,FIELD2...)  SELECT ...
表结构和表数据一起创建

​ 建表高阶语句(CTAS —— CREATE TABLE AS SELECT)
​ CTAS
​ CTAS 常用于筛选某表中的数据出来并作为新表的内容
​ CTAS 不能创建 分区表、分桶表、外部表
​ eg:筛选2015年之前的数据作为新表

​create table hive_ext_test_before2015 as
select * from hive_ext_regex_test1w
where year(order_time) <= 2015;

​ CTAS WITH CTE(WITH 作为数据来源)
​ eg:筛选2015年之前的全部数据和2015年之后男性中订单数超过5条记录或订单总金额超过50000的数据

CREATE TABLE hive_test_before2015_and_male_over5or5w_after2015 AS
WITH 
​	before2015 AS (SELECT * FROM hive_ext_regex_test1w
​		WHERE YEAR(order_time)<=2015),
​	agg_male_over5or5w AS (
​		SELECT user_id
​		FROM hive_ext_regex_test1w
​		WHERE YEAR(order_time)>2015 AND user_gender = '男'
​		GROUP BY user_id
​		HAVING COUNT(*) >= 5 OR SUM(order_amount) >= 50000),
​	male_over5or5w AS (
​		SELECT * FROM hive_ext_regex_test1w A
​		INNER JOIN agg_male_over5or5w B
​		ON A.user_id = B.user_id AND YEAR(A.order_time)>2015)
​SELECT * FROM before2015 
​UNION ALL
​SELECT * FROM male_over5or5w;

​ CTL 完全复制表结构

​CREATE TABLE employee_like LIKE employee;
​					-- 有时还需要添加内容
​INSERT INTO employee_like SELECT * FROM employee;


​ 创建临时表
​ 临时表只对当前session有效,session退出后自动删除
​ 表空间位于/tmp/hive-<user_name>(安全考虑),根据Modify的时间查找对应的临时表文件。
​ 如果创建的临时表和已创建的常规表表名相同,优先使用临时表

​CREATE TEMPORARY TABLE TABLE_NAME(...) | AS SELECT ... ✔ | LIKE ... 


​创建视图
​ 视图本质是一条复杂的公用的查询语句,实际上并不存储数据,查询视图实际上是在查询背后的基础表。

DROP VIEW IF EXISTS hive_view_test2020
CREATE VIEW IF NOT EXISTS hive_view_test2020 AS SELECT * FROM hive_ext_regex_test1w
WHERE year(order_time)=2020;
CTE & TEMPORARY TABLE & View 的区别

​ View :简化复杂查询
​ TEMPORARY TABLE : 短期数据处理 复杂查询的中间结果 预聚合数据存储
​ CTE : 单词查询使用。

B. 删除/修改表
DROP TABLE IF EXISTS employee [WITH PERGE];
​With PERGE直接删除(可选),否则会放到 .Trash目录
​TRUNCATE TABLE employee;
清空表数据
​			
​修改表是可以在创建表之后进行追加描述的。
​ALTER TABLE employee RENAME TO new_employee;(修改表名,常用于数据备份)
​ALTER TABLE c_employee SET TBLPROPERTIES ('key'='value');
​常见的表属性
​	'comment':用于提供关于表的描述性注释。
​	'serde':指定用于序列化和反序列化数据的序列化/反序列化器。
​	'location':指定表的物理存储位置。
​	'inputformat':指定输入数据的格式。
​	'outputformat':指定输出数据的格式。
​	'external':指示表是否为外部表(外部表的数据存储在外部位置,不受表删除操作的影响)。
​	...(可设置的表属性一般可通过DESCRIBE FORMATTED TABLE_NAME查看)
​	key不一定已存在:可以新建属性,也可以对已有属性进行修改。
​ALTER TABLE employee_internal SET SERDEPROPERTIES ('field.delim' = '$');
​ALTER TABLE c_employee SET FILEFORMAT RCFILE; -- 修正表文件格式
​通常用于拉链表的情况
​-- 修改表的列操作
​ALTER TABLE employee_internal CHANGE old_name new_name STRING; -- 修改列名
​ALTER TABLE c_employee ADD COLUMNS (work string); -- 添加列
​ALTER TABLE c_employee REPLACE COLUMNS (name string); -- 替换
C.查看表信息
show tables;							查看所有表
SHOW TABLES LIKE 'TABLE_NAME'			快速检查是否存在某表
desc inner_tab_employee;				查看表结构(字段名称、类型等)
desc formatted inner_tab_employee;		获取表的详细信息(包括分区信息、字段信息、表属性、存储信息等)
show create table inner_tab_employee;	获取创建表的完整SQL语句
D.分区表

定义:partitioned by(PAR_FIELD_NAME DATA_TYPE, …)
数据:

drop table if exists hive_internal_par_ext_regex_test1w;
create table if not exists hive_internal_par_ext_regex_test1w(user_id int,user_gender string,order_time timestamp,order_amount decimal(10,2)
)
partitioned by (year int)
row format delimited
fields terminated by ','
stored as textfile;

静态分区
1. 简单文本处理:
– 从文件中筛选2012年的数据
cat test1w.log | awk ‘/2012-/{print $0}’>test2012.log
– 将该数据上传到该表的2012年的分区下
load data local inpath ‘/root/hive/data/course/test2012.log’
overwrite into table hive_internal_par_ext_regex_test1w partition(year=2012);
2. 复杂数据处理:
INSERT OVERWRITE TABLE sales PARTITION(year=2023, month=3)
SELECT …
FROM another_table
WHERE …

动态分区 优先级
SET hive.exec.dynamic.partition = true; – 1.会话 ✔
SET hive.exec.dynamic.partition.mode = nonstrict;
hive-site.xml – 2.个性化配置
hive-default.xml – 3.为所有配置项提供默认配置

INSERT OVERWRITE TABLE hive_internal_par_ext_regex_test1w PARTITION (year) 
SELECT *, year(order_time) FROM hive_ext_regex_test1w where year(order_time)>=2014;
(RegexSerDe不适用)
(分区字段除了可以从源表中获取,也可以从计算字段中获取 PARTITION(`year`) <=> `year(order_time)` )

虚拟分区的创建:只能使用动态分区的语法,并且需要指定值。
动态分区和静态分区的区别:
静态分区:
分区键值必须在插入数据时明确指定
可以向一个分区内导入数据
动态分区:
分区键值在插入数据时动态指定
可以向多个分区内导入数据

查看分区信息SHOW PARTITIONS TABLE_NAME;
手动添加分区ALTER TABLE hive_internal_par_ext_regex_test1w ADD PARTITION(year=2021);可以将符合数据结构的文件直接放到分区的路径下,从而实现分区数据的添加。
手动删除分区ALTER TABLE hive_internal_par_ext_regex_test1w DROP PARTITION(year=2021);
eg:设置一个定时任务,定时删除三年前同月份的分区,并添加当年新月份的数据(一个月结束之后才能获取到该月完整的分区数据)
dt=$(date -d '-1 month' '+%F')
del_year=$(date -d "$dt -3 year" '+%Y')
del_month=$(date -d "$dt -3 year" '+%m')
add_year=$(date -d '+%Y')
add_month=$(date -d '+%m')
hive -e "ALTER TABLE hive_internal_par_ext_regex_test1w DROP PARTITION(year=$del_year,month=$del_month);"
if [ $? -eq 0 ];thenecho "SUCCESS TO DROP PREVIOUS PARTITION"
elseecho "FAIL TO DROP PREVIOUS PARTITION"
fi
hive -e "ALTER TABLE hive_internal_par_ext_regex_test1w ADD PARTITION(year=$add_year,month=$add_month);"
if [ $? -eq 0 ];thenecho "SUCCESS TO ADD NEW PARTITION"
elseecho "FAIL TO ADD NEW PARTITION"
fi
E.分桶表
clustered by (FIELD_NAME) INTO 2 BUCKETScreate table if not exists hive_internal_par_cluster_ext_regex_test1w(user_id int,user_gender string,order_time timestamp,order_amount decimal(10,2))partitioned by (year int)clustered by (order_time) into 4 buckets row format delimitedfields terminated by ','stored as textfile;INSERT OVERWRITE TABLE hive_internal_par_cluster_ext_regex_test1w PARTITION(year)SELECT *, year FROM hive_ext_regex_test1w where year(order_time)>=2014;分桶抽样随机抽样基于随机列SELECT * FROM TABLE_NAME TABLESAMPLE(BUCKET 3 OUT OF 4 ON rand()) s;随机抽样基于指定列(使用分桶列更高效)SELECT * FROM TABLE_NAME TABLESAMPLE(BUCKET 3 OUT OF 32 ON id) s;** 基于随机列和指定列的区别:基于随机列的抽样提供了数据的随机和均匀代表性,适合于需要估计整个数据集的参数时。基于指定列的抽样则适用于对数据集的特定部分感兴趣的情况,例如分析特定区域的销售数据或特定时间段的用户行为。** 如何理解`BUCKET x OUT OF y`?即将原本的桶分成y份后的顺序的第x个。假设Num Buckets=4,x=2,y=8,明显桶的份数不够8份,因此将4个桶切分为8份,并且获取到第二份的数据。
​			![bucket抽样](./assets/bucket%E6%8A%BD%E6%A0%B7.png)
​			bucket的顺序是A1,B1 , C1 , D1 , A2 , B2 , C2 , D2
​			假设y<Num Buckets,那么直接假设合并即可。未抽样数据:		抽样数据:2014,945			2014,2342015,931			2015,2102016,858	1/4		2016,2052017,909	===>	2017,220 ===> 对每个分区数据进行抽样2018,911			2018,224	2019,928			2019,224临时表如何判断该表是否为临时表?通过命名看出来,如果有_tmp_的命名则是临时表;SHOW CREATE TABLE TABLE_NAME;使用环境:Hive UITableau(数据呈现),Zeppelin(交互)

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

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

相关文章

图文证明 泰勒公式展开

泰勒公式 泰勒公式简单来说就是,可以用一个N次多项式来表示出一个连续可导的函数 f(x) 是一个用函数在某点的信息描述其附近取值的公式 第一步 思考 这是一个sin(x)的图像 用函数在原点的信息描述其附近取值 用一阶导数贴合: 直接用切线来贴合就好 画一个点(0,sin(0)除的切…

[NISACTF 2022]babyupload

[NISACTF 2022]babyupload wp 信息搜集 进入页面&#xff1a; 尝试文件上传&#xff0c;但是各种后缀名我都试过了&#xff0c;过不去。 在源码中发现提示&#xff0c;存在 ./source 路径&#xff1a; 访问该路径得到源码&#xff1a; from flask import Flask, request, r…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…

精品Nodejs实现的在线菜谱食谱美食学习系统的设计与实现

《[含文档PPT源码等]精品Nodejs实现的在线菜谱学习系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows…

day5--java基础编程:异常,内部类

6 异常 6.1 异常概述 出现背景&#xff1a; 在使用计算机语言进行项目开发的过程中&#xff0c;即使程序员把代码写得尽善尽美&#xff0c;在系统的运行过程中仍然会遇到一些问题&#xff0c;因为很多问题不是靠代码能够避免的&#xff0c;比如:客户输入数据的格式&#xff0c…

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

图片处理软件,批量缩放图片尺寸

无论是社交媒体上的分享&#xff0c;还是工作中的图片素材&#xff0c;往往大小不一、形状不同&#xff0c;这时如何批量高效地对这些图片进行缩放就显得尤为重要。传统的图片处理软件&#xff0c;不仅操作复杂&#xff0c;而且处理速度慢&#xff0c;更无法实现批量化处理。但…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

【LeetCode:17. 电话号码的字母组合 | 递归 + 回溯 + 组合】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

计算机网络【DNS】

DNS 基本概述 与 HTTP、FTP 和 SMTP 一样&#xff0c;DNS 协议也是应用层的协议&#xff0c;DNS 使用客户-服务器模式运行在通信的端系统之间&#xff0c;在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特…

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…

从PDF中提取图片

由于工作需要&#xff0c;要从pdf文件中提取出图片保存到本地&#xff0c;项目中就引用到了Apache PDFBox库。 1 什么是Apache PDFBox? Apache PDFBox库&#xff0c;一个用于处理PDF文档的开源Java工具。它允许用户创建全新的PDF文件&#xff0c;操作现有的PDF文档&#xff0…

利用ufun对部件进行操作(新建、打开、保存、另存、关闭等)

一、概述 在NX二次开发中我们常常会用到新建、打开、保存、另存为和关闭命令&#xff0c;这些函数一般放在UF_part.h头文件下&#xff0c;下面针对以上有关功能结合案例进行说明。 二、功能函数结合案例说明 2.1新建文件创建块保存功能 1&#xff09;NXOpenC代码 #include …

4.32 构建onnx结构模型-Erf

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Erf 结点进行分析 方式 方法一&…

抖音详情API:从零开始构建抖音应用

随着短视频的兴起&#xff0c;抖音已经成为了一个全球范围内的热门平台。对于开发人员而言&#xff0c;利用抖音详情API从零开始构建抖音应用具有巨大的潜力和机会。本文将为你提供从零开始构建抖音应用的指南&#xff0c;包括开发环境搭建、API请求格式、用户认证等关键环节&a…

移动硬盘打不开怎么办?没有比这更好的办法了

移动硬盘打不开是常见故障&#xff0c;可能的原因有很多&#xff0c;例如硬盘驱动器故障、文件系统损坏、分区表错误等。本文将详细分析这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助您解决移动硬盘打不开的问题。 当移动硬盘打不开时&#xff0c;为了保留其中的文…

[LitCTF 2023]Vim yyds

[LitCTF 2023]Vim yyds wp 题目页面如下&#xff1a; 搜索一番&#xff0c;没有发现任何信息。题目描述中说到了源码泄露&#xff0c;那么先进行目录扫描。 dirsearch 目录扫描 命令&#xff1a; dirsearch -u "http://node4.anna.nssctf.cn:28588/"返回结果&…

使用docker轻量化部署snmp agent(SNMPv2访问)

文章目录 服务器环境说明单机部署&#xff08;非挂载conf文件版&#xff09;debian:buster-slim容器简介实现步骤创建Dockerfile创建SNMP配置文件 (snmpd.conf)构建Docker镜像运行Docker容器 注意补充复制容器文件到本地容器、镜像操作 单机部署&#xff08;挂载conf文件版&…

12.30序列检测(重叠、不重叠、连续、不连续、含无关项)——移位寄存器,状态机;状态机(二段式,三段式)

状态机-重叠序列检测 timescale 1ns/1nsmodule sequence_test2(input wire clk ,input wire rst ,input wire data ,output reg flag ); //*************code***********//parameter S00, S11, S22, S33, S44;reg [2:0] state, nstate;always(posedge clk or negedge rst) b…

CLion Nova:全新的C/C++ IDE

CLion Nova是一款备受期待的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains专门为C/C开发者设计。这款IDE提供了许多新的功能和改进&#xff0c;使用 ReSharper C/Rider C 语言引擎而不是 CLion “传统” 引擎&#xff0c;以满足C/C开发者的需求。目前预览版…