Hive分区、分桶、类型、函数、运算符指令详解

本文详细介绍了Hive的内部表和外部表的概念与区别,包括创建外部表的命令。深入讲解了分区表和分桶表的原理及指令,强调了分桶在数据抽样和查询效率提升上的作用。此外,讨论了Hive的数据类型,如基本类型和复杂类型的使用案例,特别是数组、map和struct的结构与查询方法。还涵盖了Hive的运算符和内置函数,包括数学、类型转换、日期、条件、字符串及聚合函数,以及explode函数的使用示例。
摘要由CSDN通过智能技术生成

内部表和外部表

一、内部表的概念

先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件方式来插入数据),这样的表称之为hive的内部表

二、外部表的概念
  1. HDFS里已经有数据了,然后,通过hive创建一张表来管理这个文件数据。则这样表称之为外部表
  2. 注意,hive外部表管理的是HDFS里的某一个目录下的文件数据
三、外部表创建命令:

进入hive,执行:create external table stu (id int,name string) row format delimited fields terminated by ’ ’ location ‘/目录路径’

四、内部表和外部标的区别
  1. 对于内部表,在删除该表的时候,HDFS对应的目录节点会被删除
  2. 对于外部表,在删除该表的时候,HDFS对应的目录节点不会删除

基础命令详解

命令 作用 额外说明
show databases; 查看都有哪些数据库
create database park; 创建park数据库 创建的数据库,实际是在Hadoop的HDFS文件系统里创建一个目录节点,统一存在: /user/hive/warehouse 目录下
use park; 进入park数据库
show tables; 查看当前数据库下所有表
create table stu (id int,name string); 创建stu表,以及相关的两个字段 1. hive里,表示字符串用的是string,不用char和varchar
2. 所创建的表,也是HDFS里的一个目录节点
insert into stu values(1,‘zhang’) 向stu表插入数据 1. HDFS不支持数据的修改和删除,因此已经插入的数据不能够再进行任何的改动
2. 在Hadoop2.0版本后支持了数据追加。实际上,insert into 语句执行的是追加操作
3. hive支持查询,行级别的插入。不支持行级别的删除和修改
4. hive的操作实际是执行一个job任务,调用的是Hadoop的MR
5. 插入完数据之后,发现HDFS stu目录节点下多了一个文件,文件里存了插入的数据,因此,hive存储的数据,是通过HDFS的文件来存储的。
select * from stu 查看表数据 也可以根据字段来查询,比如select id from stu
drop table stu 删除表
load data local inpath ‘/home/software/1.txt’ into table stu; 通过加载文件数据到指定的表里 1. 在执行完这个指令之后,发现hdfs stu目录下多了一个1.txt文件。由此可见,hive的工作原理实际上就是在管理hdfs上的文件,把文件里数据抽象成二维表结构,然后提供hql语句供程序员查询文件数据
2. 可以做这样的实验:不通过load 指令,而通过插件向stu目录下再上传一个文件,看下hive是否能将数据管理到stu表里。
create table stu1(id int,name string) row format delimited fields terminated by ’ '; 创建stu1表,并指定分割符 空格。
desc stu 查看 stu表结构
create table stu2 like stu 创建一张stu2表,表结构和stu表结构相同 like只复制表结构,不复制数据
insert overwrite table stu2 select * from stu 把stu表数据插入到stu2表中
insert overwrite local directory ‘/home/stu’ row format delimited fields terminated by ’ ’ select * from stu; 将stu表中查询的数据写到本地的/home/stu目录下
insert overwrite directory ‘/stu’ row format delimited fields terminated by ’ ’ select * from stu; 将stu表中查询的数据写到HDFS的stu目录下
from stu insert overwrite table stu1 select * insert overwrite table stu2 select *; 将stu表中查询的数据写到stu1以及stu2两张表中
alter table stu rename to stu2 为表stu重命名为stu2
alter table stu add columns (age int); 为表stu增加一个列字段age,类型为int
exit 退出hive

分区表指令

一、分区表概述
  1. 分区表可以通过添加指定的字段来提高Hive的查询效率
  2. 在数据量较大的情况下,往往会添加分区表来避免全表查询
二、分区表指令
指令 作用 额外说明
create table book (id int, name string) partitioned by (category string) row format delimited fields terminated by ‘\t’; 创建book表,以category作为分区 在创建分区表时,partitioned字段可以不在字段列表中。生成的表中自动就会具有该字段。
load data local inpath ‘/home/cn.txt’ overwrite into table book partition (category=‘cn’); 将本地文件cn.txt添加到book表中,分区字段为cn 在HDFS下生成category=cn目录
select * from book where category=‘cn’; 查看分区为cn的数据
ALTER TABLE book add PARTITION (category = ‘jp’) location ‘/user/hive/warehouse/park.db/book/category=jp’; 将指定的目录添加为分区字段
show partitions iteblog; 查看分区
msck repair table book; 修复分区
alter table book drop partition(category=‘cn’); 删除分区
alter table book partition(category=‘french’) rename to partition (category=‘hh’); 修改分区的名字

分桶表指令

一、概述
  1. 分桶表是一种更细粒度的数据分配方式
  2. 一个表既可以分区也可以分桶
  3. 分桶的主要作用是实现数据的抽样,方便进行数据测试
  4. 分桶表通过hash分桶算法,将数据分放在不同的桶(hdfs中的文件)中,方便后续获取
  5. 分桶表机制默认是不开启的,需要手动开启:set hive.enforce.bucketing=true;
  6. 分桶表不允许以外部文件方式导入数据,只能从另外一张表数据导入
二、分桶表语法
指令 作用 额外说明
create table teacher(name string) clustered by (name) into 3 buckets row format delimited fields terminated by ’ '; 创建teacher表,以name作为分桶机制,分为3个桶
insert overwrite table teacher select * from tmp; 将tmp表中的数据添加到teacher表中 实际上是产生了3个文件用于存储不分桶的数据
select * from teacher tablesample(bucket 1 out of 3 on name); 进行抽样 抽样格式为:bucket x out of y on XXX
1. x表示抽样的起始桶,例如bucket 1 out of 3表示从第1 个桶开始抽取数据
2. y决定抽样的比例,要求必须是桶数的因子或者整数倍
a. 如果桶数为6,y为2,则表示抽取6/2=3个桶中的数据
b. 如果桶数为6,y为3,则表示抽取6/3=2个桶中的数据
c. 如果桶数为6,y为12,则表示抽取6/12=0.5个桶中的数据
3. 如果桶数为6,抽样为bucket 1 out of 3 on id表示从第1个桶开始抽样,抽取2个桶的数据,所以抽取的样本为1和4桶中的数据

数据类型

一、基本类型
Hive中的类型 Java中的类型
tinyint byte
smallint short
int int
bigint long
boolean boolean
float float
double double
string String
timestamp TimeStamp
binary byte[]
二、复杂类型
数组类型 array

案例一
原始数据:
100,200,300
200,300,500
建表语句:

create external table ex(vals array<int>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值