Hive:Hive基础知识 02

本文详细介绍了Hive的基础知识,包括普通表、分区表、分桶表结构及其优缺点,深入讲解了Hive中的各种Join操作,如inner join、outer join、Map Join等,并探讨了order by、sort by、distribute by和cluster by的用法。此外,还涵盖了Hive的数据类型如Array和Map,以及正则加载和内置、自定义函数的应用。
摘要由CSDN通过智能技术生成

Hive基础知识

一、Hive表结构

创建表的格式:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
(
    col1Name col1Type [COMMENT col_comment],
    co21Name col2Type [COMMENT col_comment],
    co31Name col3Type [COMMENT col_comment],
    co41Name col4Type [COMMENT col_comment],
    co51Name col5Type [COMMENT col_comment],
    ……
    coN1Name colNType [COMMENT col_comment]

)

[PARTITIONED BY (col_name data_type ...)]		--分区表结构

[CLUSTERED BY (col_name...) [SORTED BY (col_name ...)] INTO N BUCKETS] --分桶表结构

[ROW FORMAT row_format] -- 指定数据文件的分隔符
	row format delimited fields terminated by '列的分隔符' -- 列的分隔符,默认为\001
	lines terminated by '行的分隔符' --行的分隔符,默认\n
[STORED AS file_format] -- 指定文件的存储格式
[LOCATION hdfs_path] -- 用于指定表的目录所在位置,默认表的目录在数据库的目录下面

1.普通表结构

MapReduce处理的规则:
step1:检索元数据,找到表对应的HDFS目录
step2:将表的最后一级目录作为MapReduce程序的输入

结构:

Hive数据仓库目录/数据库目录/表的目录/数据文件

特点:
表的最后一级的目录是表的目录

问题:如果是一张普通表的结构,手动将文件通过HDFS命令放入表的目录下,在表中能否读到?

可以,由于表的最后一级目录是普通目录,所以在表中可以读取到

应用:
默认创建的表都是普通表结构的
一般用于将原始的数据文件构建成表的结构

2.分区表结构

普通表结构的问题?
Map阶段要做大量无意义的过滤操作,导致浪费大量资源

2.1分区表结构的设计

设计思想:
将数据按照一定规则条件划分不同的目录进行分区存储
在查询时,可以根据查询条件在目录层次进行过滤,直接由MapReduce加载需要处理的数据的目录

本质:
提前将数据划分到不同的目录中存储
通过查询条件减少底层的MapReduce的输入的数据量,避免无用的过滤,提高性能

结构:

数据仓库目录/数据库目录/表的目录/分区目录/分区数据文件

特点:
表的最后一级目录就是分区目录

应用:
最常用的表:分区外部表
分区的划分:一般都是按照时间划分的

2.2分区表结构的实现:

1.静态分区

数据文件本身就是就是按照分区规划好的,直接创建分区表,加载每个分区的数据即可
step1:直接创建分区表
step2:加载每一个文件到对应的分区中即可

创建分区表:

create table tb_emp_part1(
 empno string,
 ename string,
 job string,
 managerno string,
 hiredate string,
 salary double,
 jiangjin double,
 deptno string
) 
partitioned by (department int)
row format delimited fields terminated by '\t';

加载对应数据文件到对应的分区

load data local inpath '/export/data/emp10.txt' into table tb_emp_part1 partition (department=10);
load data local inpath '/export/data/emp10.txt' into table tb_emp_part1 partition (department=20);
load data local inpath '/export/data/emp10.txt' into table tb_emp_part1 partition (department=30);

测试SQL的执行计划:explain
普通表:

explain extended select count(*) as numb from tb_emp where deptno = 20;

在这里插入图片描述
分区表:

explain extended select count(*) as numb from tb_emp_part1 where department = 20; 

在这里插入图片描述
查看元数据:
PARTITIONS
在这里插入图片描述
SDS
在这里插入图片描述
2.动态分区

数据本身没有按照分区的规则划分,需要通过程序实现自动动态划分
步骤:
step1:先创建一个普通表,加载整体的数据
tb_emp:普通表,所有部门的员工信息都在一个目录文件中

#1.创建员工表
create database db_emp;
use db_emp;
create table tb_emp(
empno string,
ename string,
job string,
managerid string,
hiredate string,
salary double,
jiangjin double,
deptno string
) row format delimited fields terminated by '\t';
#2.加载数据
load data local inpath '/export/data/emp.txt' into table tb_emp;

step2:创建分区表

create table tb_emp_part2(
  empno string,
  ename string,
  job string,
  managerno string,
  hiredate string,
  salary double,
  jiangjin double
) 
partitioned by (dept string)
row format delimited fields terminated by '\t';

开启动态分区:

set hive.exec.dynamic.partition.mode=nonstrict;

step3:将普通表的数据写入分区表,实现动态分区

insert into table tb_emp_part2 partition(dept) 
select ……,deptno from tb_emp ;

在这里插入图片描述
在这里插入图片描述
要求:查询语句一般不用select *,强制要求查询语句的最后一个字段作为分区字段的

3

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值