Hive数据定义(2)

         hive数据定义是hive的基础知识,所包含的知识点有:数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、内部表、外部表、分区表、桶表、表的修改、视图。在上一篇文章中介绍了一部分知识点,在本篇文章中将阐述剩下的知识点内容:内部表、外部表、分区表、分桶表、表的修改、视图。

一、内部表、外部表

        不带EXTERNAL关键字创建的表是管理表,有时也称为内部表。Hive表是归属于某个数据仓库的,默认情况下Hive会将表存储在默认数据仓库中,也可以使用Use命令切换数据仓库,将所创建的表存储在切换后的数据仓库中。               

         删除内部表时,表的元数据和表数据文件同时被删除。

什么是内部表

内部表(Internal table)也称为被Hive拥有和管理的受控表(Managed table)。

默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期。

当删除内部表时,它会删除数据以及表的元数据。

创建内部表的示例代码:

--默认情况下 创建的表就是内部表
create table users(id int,name string,age int,city string
)row format delimited
fields terminated by ',';

可以使用DESC FORMATTED tablename,来获取表的元数据描述信息,从中可以看出表的类型。

例如:

什么是外部表

外部表(External table)中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。

要创建一个外部表,需要使用EXTERNAL语法关键字。

删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据。

实际场景中,外部表搭配location语法指定数据的路径,可以让数据更安全。

示例代码:

--创建外部表 需要关键字 external
--外部表数据存储路径不指定 默认规则和内部表一致
--也可以使用location关键字指定HDFS任意路径
create external table users(id int,name string,age int,city string
)row format delimited
fields terminated by ',';

内、外部表差异

执行drop table tablename 命令,分别在Hive中和HDFS中查看效果。

Hive中的表信息全被删除,不管是内部表还是外部表。

而HDFS上,外部表对应的数据文件原封不动,内部表对应的数据文件连同文件夹一起被删除

无论内部表还是外部表,Hive都在Hive Metastore中管理表定义、字段类型等元数据信息。

删除内部表时,除了会从Metastore中删除表元数据,还会从HDFS中删除其所有数据文件。

删除外部表时,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变。

如何选择内、外部表

当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表。

当数据来之不易,防止误删,请使用外部表,因为即使删除表,文件也会被保留。

Hive表对应的数据在HDFS上的存储位置

在Hive建表的时候,可以通过location语法来更改数据在HDFS上的存储路径,使得建表加载数据更加灵活方便。

语法:LOCATION '<hdfs_location>'。

对于已经生成好的数据文件,使用location指定路径将会很方便。

Location关键字的作用

        在创建外部表的时候,可以使用location指定存储位置路径,如果不指定会如何?

如果不指定location,外部表的默认路径也是位于/user/hive/warehouse,由默认参数控制。

        创建内部表的时候,是否可以使用location指定?

内部表可以使用location指定位置的。

        是否意味着Hive表的数据在HDFS上的位置不是一定要在/user/hive/warehouse下?

不一定,Hive中表数据存储位置,不管内部表还是外部表,默认都是在/user/hive/warehouse,当然可以在建表的时候通过location关键字指定存储位置在HDFS的任意路径。

二、分区表

分区表产生背景

现有3份结构化数据文件,分别记录了用户的姓名、年龄、省、城市信息。现要求通过建立一张表all_users,把3份文件同时映射加载,字段为id、name、age、province、city。

--默认情况下 创建的表就是内部表
create table all_users(id int,name string,age int,province string,city string
)row format delimited
fields terminated by ',';

现要求查询来自河南,年龄大于18岁的人的数量,sql语句如下:

select count(*) from all_users where province=‘henan’ and age>18; 

这样操作会有一些问题:

        where语句的背后需要进行全表扫描才能过滤出结果,对于hive来说需要扫描每一个文件。如果数据文件个数特别多的话,扫描效率很慢也没必要。

        本需求中,只需要扫描users_henan.txt文件即可,如何优化可以加快查询,减少全表扫描呢?

         指定文件扫描和全表扫描,效率还是存在差异的。

概念

        当Hive表对应的数据量大、文件个数多时,为了避免查询时全表扫描数据,Hive支持根据指定的字段对表进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。

        比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询。

完整语法树对应位置:

创建

分区表语法

注意:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上。

--分区表建表语法
CREATE TABLE table_name (column1 data_type, column2 data_type,....) 
PARTITIONED BY (partition1 data_type, partition2 data_type,…);

针对用户信息数据,重新创建一张分区表users_par,以sheng角色作为分区字段。

create table users_par(id int,name string,age int,province string,city string
) partitioned by (sheng string)
row format delimited
fields terminated by “,";

分区表数据加载--静态分区

所谓静态分区指的是分区的属性值是由用户在加载数据的时候手动指定的。

语法如下:

load data [local] inpath 'filepath ' into table tablename partition(分区字段='分区值'...);

Local参数用于指定待加载的数据是位于本地文件系统还是HDFS文件系统。关于load语句后续详细展开讲解。

静态加载数据操作如下,文件都位于Hive服务器所在机器本地文件系统上(node1)。

load data local inpath '/home/huser/partition/users_hubei.txt' into table users_par partition(sheng='hubei');
load data local inpath '/home/huser/partition/users_henan.txt' into table users_par partition(sheng='henan');
load data local inpath '/home/huser/partition/users_hubei.txt' into table users_par partition(sheng='anhui');

本质

外表上看起来分区表好像没多大变化,只不过多了一个分区字段。实际上分区表在底层管理数据的方式发生了改变。这里直接去HDFS查看区别。

查询分区表

现要求查询来自河南,年龄为18岁的人的信息,sql语句如下:

select count(*) from users_par where sheng=‘henan’ and age>18;

分区表的使用重点在于:

一、建表时根据业务场景设置合适的分区字段。比如日期、地域、类别等;

二、查询的时候尽量先使用where进行分区过滤,查询指定分区的数据,避免全表扫描。

多重分区表

通过建表语句中关于分区的相关语法可以发现,Hive支持多个分区字段: PARTITIONED BY (partition1 data_type, partition2 data_type,….)。

多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。

从HDFS的角度来看就是文件夹下继续划分子文件夹。比如:把全国人口数据首先根据省进行分区,然后根据市进行划分,如果你需要甚至可以继续根据区县再划分,此时就是3分区表。

代码示例:

--单分区表,按省份分区
create table users_par(id int,name string,age int,province string,city string
) partitioned by (sheng string)
row format delimited
fields terminated by “,";
--双分区表,按省份和市分区
create table users_par_sec(id int,name string,age int,province string,city string
) partitioned by (sheng string, shi string)
row format delimited
fields terminated by “,";
--多分区表的数据插入和查询使用
load data local inpath ‘文件路径’ into table users_par partition(sheng=‘henan’);
load data local inpath ‘文件路径’ into table t_user_province_city partition(sheng=‘henan’,shi=‘xinyang’);
select * from users_par_sec where province='henan' and city= ' xinyang';

三、分桶表

概念

分桶表也叫做桶表,叫法源自建表语法中bucket单词,是一种用于优化查询而设计的表类型。

分桶表对应的数据文件在底层会被分解为若干个部分,通俗来说就是被拆分成若干个独立的小文件。

在分桶时,要指定根据哪个字段将数据分为几桶(几个部分)。

规则

分桶规则如下:桶编号相同的数据会被分到同一个桶当中。

Bucket number = hash_function(bucketing_column)  mod   num_buckets
分桶编号      = 哈希方法(分桶字段)           取模  分桶个数

hash_function取决于分桶字段bucketing_column的类型:

        如果是int类型,hash_function(int) == int;

        如果是其他比如bigint,string或者复杂数据类型,hash_function比较棘手,将是从该类型派生的某个数字,比如hashcode值。

完整语法树所在位置:

语法

CLUSTERED BY (col_name)表示根据哪个字段进行分;

INTO N BUCKETS表示分为几桶(也就是几个部分)。

需要注意的是,分桶的字段必须是表中已经存在的字段。

--分桶表建表语句
CREATE [EXTERNAL] TABLE table_name
[(col_name data_type, ...)]
CLUSTERED BY (col_name)
INTO N BUCKETS;

创建

现有表users_cluster.txt记录了10个人的信息,要求建分桶表users_clu将改文件映射成数据表并分为3桶,字段为id、name、age、city。

根据city把数据分为3桶,建表语句如下:

CREATE TABLE users_clu(id int,name string,age int,city string)CLUSTERED BY(city) INTO 3 BUCKETSrow format delimitedfields terminated by ',';

在创建分桶表时,还可以指定分桶内的数据排序规则:

CREATE TABLE users_clu_sort(id int,name string,age int,city string)CLUSTERED BY(city) Sorted by (id asc)  INTO 3 BUCKETSrow format delimitedfields terminated by ',';

分桶表的数据加载

--将源数据上传到HDFS,users_clu表对应的路径下
hadoop fs -put users.txt /user/hive/warehouse/demo.db/users_clu
--step3:使用insert+select语法将数据加载到分桶表中
insert into users_clu select * from users_source;

到HDFS上查看users_clu底层数据结构可以发现,数据被分为了3个部分。

并且从结果可以发现,分桶字段一样的数据就一定被分到同一个桶中。

好处

基于分桶字段查询时,减少全表扫描

--不再需要进行全表扫描过滤
--根据分桶的规则hash_function(hangzhou) mod 3计算出分桶编号
--查询指定分桶里面的数据 就可以找出结果  此时是分桶扫描而不是全表扫描
select * from users_clu where city=“hangzhou";

分桶表数据进行高效抽样

当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。抽样可以从被抽取的数据中估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。

四、表的修改

重命名

1.语法格式 ALTER TABLE table_name RENAME TO new_table_name;

2.Hive实例操作 hive(hivedwh)>alter table users rename users_new;

增加和删除分区

1.增加分区

        (1)增加单个分区

hive(hivedwh)>alter table users_par add partition(province=‘hebei');         

        (2)同时增加多个分区,多个分区之间使用空格

hive(hivedwh)>alter table users_par add partition(province=‘hebei') partition(province=‘shanxi');

2.删除分区       

        (1)删除单个分区  

hive(hivedwh)>alter table users_par drop partition (province=‘hebei');         

        (2)同时删除多个分区,多个分区之间使用逗号

hive(hivedwh)>alter table users_par drop partition(province=‘hebei'), partition(province=‘shanxi');

修改和增加替换列

1.语法

修改列的语法格式:

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

增加和替换列的语法格式:

ALTER TABLE table_name ADD|REPLACE COLUMNS(col_name data_type [COMMENT col_comment], …)

关键字ADD表示新增一字段,字段位置在所有列后面(Partition列前);REPLACE则表示替换表中所有字段。

2.实例操作

        (1)添加列

hive(hivedwh)>alter table users add columns(sex string);

        (2)修改列

hive(hivedwh)>alter table users change column sex xingbie string;

        (3)替换列

hive(hivedwh)>alter table users replace columns(id int, hight float, weight float);

五、视图

概念

Hive中的视图(view)是一种虚拟表,只保存定义,不实际存储数据。

通常从真实的物理表查询中创建生成视图,也可以从已经存在的视图上创建新视图。

创建视图时,将冻结视图的架构,如果删除或更改基础表,则视图将失败。

视图是用来简化操作的,不缓冲记录,也没有提高查询性能。

相关语法

--hive中有一张真实的基础表users
select * from users;
--1、创建视图
create view v_users as select id,name,city from users limit 3;
--能否从已有的视图中创建视图呢  可以的
create view v_users_view as select *  from v_users limit 2;
--2、显示当前已有的视图show tables;
show views;--hive v2.2.0之后支持
--3、视图的查询使用
select * from v_users;
--能否插入数据到视图中呢?
--不行 报错  SemanticException:A view cannot be used as target table for LOAD or INSERT
insert into v_users select count_date,county,state,deaths from users;
--4、查看视图定义
show create table users;
--5、删除视图
drop view v_users_view;
--6、更改视图属性
alter view v_users set TBLPROPERTIES ('comment' = 'This is a view');
--7、更改视图定义
alter view v_users as  select name, city from users limit 2;

好处

将真实表中特定的列数据提供给用户,保护数据隐式

--通过视图来限制数据访问可以用来保护信息不被随意查询:
create table userinfo(firstname string, lastname string, ssn string, password string);
create view safer_user_info as select firstname, lastname from userinfo;
--可以通过where子句限制数据访问,比如,提供一个员工表视图,只暴露来自特定部门的员工信息:
create table employee(firstname string, lastname string, ssn string, password string, department string);
create view techops_employee as select firstname, lastname, ssn from userinfo where department = 'java';

降低查询的复杂度,优化查询语句

示例代码:

--使用视图优化嵌套查询
from (select * from people join carton(cart.pepople_id = people.id) where firstname = 'join')a select a.lastname where a.id = 3;
--把嵌套子查询变成一个视图
create view shorter_join as
select * from people join cart
on (cart.pepople_id = people.id) where firstname = 'join';
--基于视图查询
select lastname from shorter_join where id = 3;

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

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

相关文章

Vue2.脚手架

全局安装&#xff1a;npm i vue/cli -g检查是否成功安装&#xff1a;vue --version新建项目&#xff1a;vue create 项目名 通过nodejs安装的时候&#xff0c;可以直接代理和仓库&#xff0c;~/.npmrc文件内容如下&#xff1a; proxysocks5://127.0.0.1:7897 registryhttps:/…

Kafka的核心原理

Topic的分区和副本机制 分区有什么用呢? 作用&#xff1a; 1- 避免单台服务器容量的限制: 每台服务器的磁盘存储空间是有上限。Topic分成多个Partition分区&#xff0c;可以避免单个Partition的数据大小过大&#xff0c;导致服务器无法存储。利用多台服务器的存储能力&#…

Matlab数学建模算法之模拟退火算法(SA)详解

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

WEB 3D技术 three.js 聚光灯

本文 我们来说说 点光源和聚光灯 点光源 就像一个电灯泡一样 想四周发散光 而聚光灯就像手电筒一样 像一个方向射过去 距离越远范围越大 光越弱 我们先来看一个聚光灯的效果 我们可以编写代码如下 import ./style.css import * as THREE from "three"; import { O…

【JavaScript】深度理解js的函数(function、Function)

简言 学了这么久的JavaScript&#xff0c;函数在JavaScript中最常用之一&#xff0c;如果你不会函数&#xff0c;你就不会JavaScript。 函数就是Function对象&#xff0c;一个函数是可以通过外部代码调用的一个“子程序”&#xff0c;它是头等&#xff08;first-class&#xf…

linux 如何创建文件

我们在写一些教程的时候&#xff0c;经常会需要创建一些用于演示的文档&#xff0c;这些文档往往需要填充一些不特定的内容。那么如何快速的创建演示用的文档呢&#xff1f; docfaker.py docfaker.py是一个py脚本&#xff0c;用于创建一个简单的txt文档&#xff0c;docfaker.…

MySQL 从零开始:06 数据检索

文章目录 1、数据准备2、限制结果3、完全限定名4、排序检索 所谓数据检索&#xff0c;就是前面所讲的”增删改查“的”查“。 注&#xff1a;本文使用的“行”指数据表中的“记录”&#xff0c;“列”指数据表中的“字段”。 在第四节《表的增删改查》中已经介绍了 select 查询…

Hive命令行运行SQL将数据保存到本地如何去除日志信息

1.场景分析 先有需求需要查询hive数仓数据并将结果保存到本地&#xff0c;但是在操作过程中总会有日志信息和表头信息一起保存到本地&#xff0c;不符合业务需要&#xff0c;那如何才能解决该问题呢&#xff1f; 废话不多少&#xff0c;直接上代码介绍&#xff1a; 2.问题解决…

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力…

计算机网络NCEPU复习资料

目录 一&#xff0e;概述&#xff1a; 计算机网络组成&#xff1a; 计算机网络分类&#xff1a; 计算机网络体系结构&#xff1a; C/S架构与P2P架构区别&#xff1a; OSI开放式系统互连参考模型&#xff1a; OSI开放式系统互连参考模型 相关协议&#xff1a; 五层协议网…

Vue.js设计与实现阅读-3

Vue设计与实现阅读-3 1、声明式描述UI2、渲染器3、组件4、模板的工作原理5、Vue.js 是各个模块组成的有机整体 前言 前面一章我们了解了&#xff0c;开发体验是衡量一个框架的重要指标之一。提供友好的警告信息至关重要&#xff0c;但是越详细的警告信息&#xff0c;意味着框架…

5 微信小程序

功能开发 5 功能开发概要今日详细1.发布1.1 发布流程的问题1.2 组件&#xff1a;进度条1.3 修改data中的局部数据1.4 发布示例效果前端后端 1.5 闭包 2.获取前10条新闻&#xff08;动态/心情&#xff0c;无需分页&#xff09;3.复杂版4.文章详细页面 各位小伙伴想要博客相关资料…

【python入门】day26: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

Modbus协议学习第一篇之基础概念

什么是“协议” 大白话解释&#xff1a;协议是用来正确传递消息数据而设立的一种规则。传递消息的双方&#xff08;两台计算机&#xff09;在通信时遵循同一种协议&#xff0c;即可理解彼此传递的消息数据。 Modbus协议模型 Modbus协议模型较为简单&#xff0c;使用一种称为应用…

soc算法【周末总结】

1 实验一&#xff08;SOC误差30%放电实验&#xff09; 1.1 实验过程 1、对电池包进行充电&#xff0c;将昨天放空的电池包进行充电&#xff0c;充电至SOC40%左右&#xff1b; 2、电池包SOC为38%时&#xff0c;手动修改SOC值为70%&#xff0c;开始放电 3、SOC由70%缓慢降至4…

Windows下面基于pgsql15的备份和恢复

一、基础备份 1.创建一个文件用来存储备份数据 2.备份指令 $CurrentDate Get-Date -Format "yyyy-MM-dd" $OutputDirectory "D:\PgsqData\pg_base\$CurrentDate" $Command "./pg_basebackup -h 127.0.0.1 -U postgres -Ft -Pv -Xf -z -Z5 -D $O…

教育观察期刊投稿邮箱、投稿要求

《教育观察》创刊于2012年&#xff0c;是国家新闻出版总署批准的正规教育类学术期刊&#xff0c;本刊致力于在教育实践中以“观察”为方法&#xff0c;以“观察者”为主体&#xff0c;以“新观察”为旨趣&#xff0c;打造从教育实践中洞察教育未来的教育研究与交流的平台。主要…

关于Quartz远程调用服务方法失败如何解决,@Inner详细介绍

1.单独在要调用服务的controller写上相关方法&#xff08;Inner(value true)要走aop&#xff0c;会检测是否有内部调用标识&#xff09;具体见下述 2. 编写Feign远程调用的接口&#xff0c;注意加上RequestHeader(SecurityConstants.FROM) String from。因为inner(value true…

【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

该示例演示了如何使用 LabVIEW FPGA 解码 IS 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标&#xff08;例如R 系列、CompactRIO&#xff09;。IS 用于对系统和组件内的数字音频数据进行编码。例如&#xff0c;MP3 播放器或 DVD 播放器内部的数字音频通常使用 …

【从零开始学习Java重要集合】深入解读ThreadLocal类

目录 前言&#xff1a; ThreadLocal&#xff1a; ThreadLocal的内部结构&#xff1a; ThreadLocal的常用方法&#xff1a; 1.set方法&#xff1a; 2.get方法&#xff1a; 3.setInitialValue方法 remove方法&#xff08;&#xff09;&#xff1a; ThreadLocalMap&…