Hive表【汇总】

提前必备

1、内部表和外部表的区别

概念讲解

外部表:1、存放他人给予自己的数据2、当我们删除表操作时,会将表的元数据删除,保留数据文件
内部表:1、存放已有的数据2、当我们删除表操作时,会将表的元数据以及数据文件都删除掉

2、公共查询语句

with:一次查询内可无数次调用
temporary table:一次会话内可无数次调用【临时】
view与table:何时都可无数次调用【永久】

一:内部表

概念

  • 内部表是由 Hive 管理数据和元数据的一种表类型,通常包含表的名称、列定义、存储格式等信息。

  • 【默认创建的表】就是【内部表】

基本形式

create table if not exists inner_table_employee(name string,places array<string>,info struct<gender:string,age:int>,scores map<string,int>,dept_pos map<string,string>
)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as textfile;

二:外部表

概念

  • 创建表时,带有【external】关键字的表即为【外部表】。

  • 外部表允许在 Hive 中定义一个表结构,并对外部存储系统中的数据进行查询和分析,而不会对数据本身进行移动或修改。

基本形式

数据准备

{"name":"henry","age":22,"gender":"male","phone":"18014499655"}
{"name":"pola","age":18,"gender":"female","phone":"18014499656"}

外部表创建

create external table if not exists hive_ext_json_family(name string,age int,gender string,phone string
)
row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
stored as textfile
location '/hive_data/hive_cha01/json';

三:分区表

1、概念

将一份大的文件拆分成多份,每一份存储在hdfs上表空间内的一个专门文件夹内

文件夹的命名包含了字段名和字段值,如:year=2012 形式。

注意:year可以作为字段来使用,但本质上year不是原始表字段,是分区字段。

2、优势

hive进行查询时就是文件流读文件,即使读取一条数据也需要加载整个文件。因此分区表将文件切割成更小的粒度,当需要针对局部数据进行检索、聚合等处理时只需要加载对应的粒度即可,从而提高了处理的效率。

3、建立分区要素

1、字段频繁出现于:一:where... , on...二:group by... , distribute by ... , cluster by...此时,就要考虑将此字段来建立分区
2、数据的容量(大),需要考虑建立分区

4、基本语法形式

create [external] table TABLE_NAME(FIELD_NAME TYPE,...)
partitioned by(PAR_FIELD_NAME TYPE,...)row format delimited | serde 'SERDE_CLASS'
....

5、实际操作

一:分区的建立

创建一级分区
drop table if exists test1w_partitioned_by_year;
create external table if not exists test1w_partitioned_by_year(user_id int,user_gender string,order_time timestamp,order_amount decimal(6,2)
)
partitioned by (year int)row format delimited
fields terminated by ';'
stored as textfile;
创建多级分区【以二级分区为例】
drop table if exists test1w_partitioned_by_year_month;
create table if not exists test1w_partitioned_by_year_month(user_id int,user_gender string,order_time timestamp,order_amount decimal(6,2)
)
partitioned by(year int,month int)row format delimited
fields terminated by ';'
stored as textfile;

二:数据的操作

静态分区

主要用处:客户按分区级别改|插入数据

1.筛选原文件:一级分区:cat test1w.log | awk '/2012-/{print $0}'>test2012.logcat test1w.log | awk '/2013-/{print $0}'>test2013.log多级分区【以二级分区为例】:cat test1w.log | awk '/2012-7/{print $0}'>test20127.logcat test1w.log | awk '/2012-8/{print $0}'>test20128.log2.装到两分区内:一级分区:test2012.log:load data local inpath '/root/file/test2012.log' overwrite into table hive_internal_par_regex_test1w partition(year=2012);test2013.log:load data local inpath '/root/file/test2013.log' overwrite into table hive_internal_par_regex_test1w partition(year=2013);多级分区【以二级分区为例】:test20127.log:load data local inpath '/root/file/test20127.log'overwrite into table zhou.test1w_partitioned_by_year_month partition(year=2012,month=7);test20128.log:load data local inpath '/root/file/test20128.log'overwrite into table zhou.test1w_partitioned_by_year_month partition(year=2012,month=8);
动态分区

主要用处:项目初期导入数据

准备工作[动态配置]

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 test1w_partitioned_by_year partition (`year`)select *,year(order_time) from test1w;多级分区【以二级分区为例】:insert overwrite table zhou.test1w_partitioned_by_year_month partition (`year`,`month`)select * ,year(order_time),month(order_time) from test1w where year(order_time)<=2012;

三:分区的其他操作【查删改】

– 查看分区信息
show partitions 表名;
– 手动添加分区
一级分区:alter table zhou.test1w_partitioned_by_year add partition (year=2014);
多级分区【以二级分区为例】:alter table zhou.test1w_partitioned_by_year_month add partition (year=2012,month=7);
– 手动删除分区
一级分区:alter table zhou.test1w_partitioned_by_year drop partition (year=2014);
多级分区【以二级分区为例】:alter table zhou.test1w_partitioned_by_year_month drop partition (year=2012,month=7);

四:分桶表

1、概念

分桶表时将一个表或分区内的数据,拆分成更小的文件片段,使抽样更加高效。

2、必知点

1、分桶字段必须是表中已存在的原始字段
2、默认采用:原始字段值的hashcode%分桶数列 => 决定当前行数据会被拆分到几号桶
3、优势:数据采样
4、采样率:10% -> 桶数定义为10
5、一般是在 【分区】 的基础上进行 【分桶】,更好地优化查询性能。

3、实际应用场景

1.抽样【数据采样】

在开发中,数据量大的情况下,我们为了针对开发做测试,就可以采用分桶来进行数据采样,采样得到的结果是一个具有代表性的查询结果,可以达到快速开发的目的。

2.拉链表【便于修改】

修改某行数据时,无需将整个文件都读取出来,只需将小份文件导出进行修改即可。

4、实际操作

一:创建分桶表

在根据year分区的基础上,对每个year内部进行了分桶,分为4份数据,便于抽样|修改

drop table if exists test1w_partitioned_SeparateBarrel;
create table if not exists test1w_partitioned_SeparateBarrel(user_id int,user_gender string,order_time timestamp,order_amount decimal(6,2)
)
partitioned by(year int)
clustered by(order_time) into 4 buckets	✔	=> 此时采样率:25%
row format delimited
fields terminated by ';'
stored as textfile;

二:数据的操作

准备工作[动态配置]
set hive.exec.dynamic.partition=true;				-- 1、会话
set hive.exec.dynamic.partition.mode=nonstrict;
hive-site.xml										-- 2、个性化配置
hive-default.xml									-- 3、为所有配置项提供默认配置
具体代码
insert into table zhou.test1w_partitioned_SeparateBarrel partition (year)
select *,year(order_time) from test1w;

三:实际应用【数据采集】

–随机抽样【基于整行数据】

基本解释

  • 取每个桶中 四分之三的数据【很少用】
  • 进行随机抽样,不考虑数据的顺序或时间等因素,可以使用类似 bucket 3 out of 4 on rand()形式,这样每次抽样的结果可能会有所不同,适合需要随机性的分析或实验。
select * from test1w_partitioned_SeparateBarrel
tablesample(bucket 3 out of 4 on rand())s;
–分桶字段抽样【基于指定列】✔

基本解释

  • 取每个桶中 四分之一的数据[桶]【随机】 => 推荐使用,使用分桶列更高效

  • 从【有序的数据】中抽样,例如按照时间排序的订单数据,可以使用类似于 bucket 3 out of 4 on order_time形式,这样可以保证抽样数据具有一定的顺序性和连续性。

最终结果分析:最后获取的数据是在每个分区【文件夹】内随机抽取指定数量【如:四分之一]的数据[桶]】=> 抽到的数据[桶]是具有随机性的。

select year,count(*) as order_count from test1w_partitioned_SeparateBarrel
tablesample ( bucket 1 out of 4 on order_time)s
group by year;

五:临时表(temporary)

1、概念

  • 一次链接(会话session)内临时创建的表格,会话结束后自动删除
默认hdfs路径:/tmp/hive/root 内根据时间寻找临时表		
idea中:show tables; 才可看到临时表。

2、实际操作

create temporary table if not exists test1w_gender as
select user_gender,count(*) as gender_cnt from zhou.test1w group by user_gender;

六:视图(view)

1、概念

  • 本质:一条较为复杂的共用的查询语句

2、实际操作

create view if not exists hive_view_test1w_Girl as
select * from test1w where user_gender = "女";

七:拉链表(zip tables)

1、发展流程

hive发展

  • hive 0.14就已经有这一逻辑模型,名为slowly changing dimension。
  • hive 2.6.0 支持merge语法,运用了 事务管理

拉链表由来

原来采用分区表,用户分区存储历史增量数据,缺点是重复数据太多
目前运用拉链表来解决这一问题

2、含义

用于解决持续增长且存在一定时间范围内重复的数据,即:合并有一定重复性【较小时间范围内】的数据。

3、优点

  • 节约空间(一份订单只有一条数据)

4、应用场景

【数据规模庞大】,新数据【在有限区间(时间…)内】存在多种状态变化

5、准备工作[动态配置]

set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on=true; -- 表合并开启
set hive.compactor.worker.threads=1; -- 表合并线程必须为一
set hive.auto.convert.join=false; -- 关闭 mapjoin
set hive.merge.cardinality.check=false; -- 关闭检查数据列的基数(列值的差异性)
set mapreduce.job.reduces=4;

6、具体代码

drop table if exists zhou.hive_zipper_order;
create table zhou.hive_zipper_order(order_id bigint,user_id bigint,order_modify_dt timestamp,order_money decimal(10,2),current_status int
)
row format delimited 
fields terminated by ',';
--导入f F的数据至普通表hive_zipper_order中
load data local inpath '/root/file/log/order_record.log'
overwrite into table zhou.hive_zipper_order;--创建拉链表hive_zipper_pc_order	✔
drop table if exists zhou.hive_zipper_pc_order;
create table zhou.hive_zipper_pc_order(order_id bigint,user_id bigint,order_create_dt timestamp,order_modify_dt timestamp,order_money decimal(10,2),current_status int
)
partitioned by(year int,month int,day int)
clustered by(order_create_dt) into 4 buckets
row format delimitedfields terminated by ','
stored as orc
tblproperties("transactional"="true");--操作历史全量数据用动态分区	✔
set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on=true;
set hive.compactor.worker.threads=1;
set hive.auto.convert.join=false;
set hive.merge.cardinality.check=false;
set mapreduce.job.reduces=4;--开启动态分区,一次性挂载至拉链表hive_zipper_pc_order中	✔
with zip_src as (select order_id,user_id,order_money,min(order_modify_dt) as order_create_dt,max(order_modify_dt) as order_modify_dt,max(current_status) as current_statusfrom zhou.hive_zipper_ordergroup by order_id,user_id,order_money
)
insert overwrite table zhou.hive_zipper_pc_order partition(year,month,day)
selectorder_id,user_id,order_create_dt,order_modify_dt,order_money,current_status,year(order_create_dt) as year,month(order_create_dt) as month,day(order_create_dt) as day
from zip_src;-- 拉链表查询	✔
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.support.concurrency=true;
select * from zhou.hive_zipper_pc_order
where to_date(order_modify_dt)='2021-02-04'
order by order_modify_dt desc;--之后每天,增量添加【在原表处新增】
load data local inpath '/root/file/log/order_record_2021_02_05.log'
overwrite into table zhou.hive_zipper_order;--拉链处理增量数据(新增新数据,修改旧数据)	✔
merge into zhou.hive_zipper_pc_order as O
using (select order_id,user_id,order_create_dt,order_modify_dt,order_money,current_status,year(order_create_dt) as year,month(order_create_dt) as month,day(order_create_dt) as dayfrom (select order_id,user_id,order_money,min(order_modify_dt) as order_create_dt,max(order_modify_dt) as order_modify_dt,max(current_status) as current_statusfrom zhou.hive_zipper_order--where to_date(order_modify_dt)='2021-02-05'group by order_id,user_id,order_money)T
) as H
on O.order_id=H.order_id
when matched then 
update set order_modify_dt=H.order_modify_dt,current_status=H.current_status
when not matched then 
insert values(H.order_id,H.user_id,H.order_create_dt,H.order_modify_dt,H.order_money,H.current_status,H.year,H.month,H.day);--验证拉链结果	✔
select * from zhou.hive_zipper_pc_order
where to_date(order_modify_dt)>to_date(order_create_dt);

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

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

相关文章

CCNA-2-V7-模块7–9:可用且可靠的网络考试答案

1.一台启用了DHCP的客户端PC刚刚启动。客户端PC在与DHCP服务器通信时,将在哪两个步骤中使用广播消息?(选两个。) DHCPDISCOVERDHCPACKDHCPOFFERDHCPREQUESTDHCPNAK 2.管理员发出命令:管理员想达到什么目的? Router(config)# interface g0/1 Router(config-if)# ip address …

Java中标识符和关键字

1.标识符 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }上述代码中在public class 后面的HelloWorld称为类名&#xff0c;main称为方法名&#xff0c;也可以将其称为标识符&#xff0c;即&#xff1a;在程…

算法学习day12(动态规划)

一、不同的二叉搜索树 二叉搜索树的性质&#xff1a;父节点比左边的孩子节点都大&#xff1b;比右边的孩子节点都小&#xff1b; 由图片可知&#xff0c;dp[3]是可以由dp[2]和dp[1]得出来的。(二叉搜索树的种类和根节点的val有关) 当val为1时&#xff0c;左边是一定没有节点的…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

Databricks Layer

前言 Databricks 中的 Bronze-Silver-Gold 层级是数据湖架构中数据组织和处理的一种方法&#xff0c;它允许数据从原始状态逐步转化为对业务决策有用的形式。这种分层方法有助于数据的可管理性、可扩展性和可维护性&#xff0c;同时也支持数据的快速摄取和灵活的分析需求。Dat…

illustrator免费插件功能强大脚本大集合300多款开发必备可收藏无需下载可直接运行ai设计印刷开发都可用

宝贝名称&#xff1a;TB48 ai悟空插件开发神器脚本仓库300多个脚本开发参考 测试版本&#xff1a;AI CC2018-2020-2021-2022-2023-2024 系统支持&#xff1a;windows系统 标签&#xff1a;Ai插件开发图片插画平面设计印刷打印图标矢量 加企鹅群可自动获取。功能不定时更新

传输层重点协议

目录 一、TCP协议 TCP协议段落格式 原理 1、确认应答机制 2、超时重传机制 3、连接管理机制 三次握手 四次挥手 &#xff08;1&#xff09;不能合并为三次挥手的原因 &#xff08;2&#xff09;延时应答机制—实现合并 &#xff08;3&#xff09;TIME_WAIT的作用 &…

【Unity2D 2022:NPC】制作NPC

一、创建NPC角色 1. 创建JambiNPC并同时创建Jambi站立动画 &#xff08;1&#xff09;点击第一张图片&#xff0c;按住shift不松&#xff0c;再选中后两张图片&#xff0c;拖到层级面板中 &#xff08;2&#xff09;将动画资源文件保存到Animation Clips文件夹中 &#xff08;…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

TongRDS 2214 docker版指引(by lqw )

文章目录 前言准备工作中心节点服务节点哨兵节点 前言 部署docker版本&#xff0c;建议先参考TongRDS2214手动部署版指引&#xff08;by lqwsy&#xff09; 在本地手动部署了一套适合业务场景的rds 服务后&#xff0c;再通过dockerfile 打镜像。 准备工作 1.准备对应的安装包…

【亚马逊云】将Amazon EC2 日志数据传输到 CloudWatch 中

文章目录 1. 创建 CloudWatchLogs 策略2. 将 CloudWatchLogs 策略附加给IAM实体3. 将 IAM 角色附加到 EC2 实例4. 在 Amazon EC2 实例上安装和配置 CloudWatch Logs5. 在CloudWatch查看EC2日志6. 参考链接 实验目的&#xff1a;在运行的 EC2 Linux 实例上安装和配置 CloudWatch…

【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 栈 栈的方法介绍 入栈push 出栈pop和 瞄一眼peek 判空isEmpty和判满isFull 模拟实现栈 push入栈 pop出栈和peek 测试 使用泛型实现栈 测试 使用链表实现栈&#xff08…

怎么减少pdf的MB,怎么减少pdf的大小

在数字化时代&#xff0c;pdf文件因其格式稳定、跨平台兼容性强等特点而广受欢迎。然而&#xff0c;随着内容的丰富&#xff0c;pdf文件的大小也日益增大&#xff0c;给文件传输和存储带来了不少困扰。本文将为你介绍多种减小pdf文件大小的方法&#xff0c;帮助你轻松应对这一问…

跳表的简单学习

跳表&#xff08;SkipList&#xff09;学习 1. 什么是跳表&#xff1f; 基于“空间换时间”思想&#xff0c;通过给链表建立索引&#xff0c;使得链表能够实现二分查找。 跳表是可以实现二分查找的有序链表。 2. 从单链表到跳表 对于一般的单链表&#xff0c;在其中进行查…

c语言指针超详解——入门篇

文章目录 前言1. 内存与地址内存编址 2. 指针变量和地址取地址操作符 &指针变量和解引用操作符 *指针变量解引用操作符指针变量的大小 3. 指针变量类型的意义指针的解引用指针-整数void* 指针 4. const 修饰指针const 修饰指针指向的变量const 修饰指针变量 5. 指针运算指针…

本地部署,AnimeGANv3: 将现实世界照片转化为动漫风格

目录 引言 技术背景 架构与原理 实验结果与分析 应用实例 本地部署 运行结果 Photo to Hayao Style Photo to Shinkai Style more suprise 支持多种风格 结论 参考文献 GitHub - TachibanaYoshino/AnimeGANv3: Use AnimeGANv3 to make your own animation works, …

智驭数据:深剖朴素贝叶斯算法及其实战疆域拓展

在浩瀚的数据海洋中&#xff0c;机器学习如同一艘智能航船&#xff0c;引领我们探索未知的知识岛屿。而在这艘船的诸多算法装备中&#xff0c;朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法以其简洁高效、逻辑清晰的特点&#xff0c;成为了处理分类问题的一把利器。本文将…

软件测试——web单功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录 Map集合的遍历方式 键找值 键值对 Lambda Map集合案例 需求与分析 问题解决 Map集合的遍历方式 键找值 先获取Map集合全部的键&#xff0c;再通过遍历键来找值。 键值对 把“键值对”看成一个整体进行遍历&#xff08;较为复杂&#xff09; Lambda JDK 1.8 开…