Hive数据仓库踏坑(上)

Hive数据仓库

了解!!!

大数据解三个问题:(1)海量(PB级以上,EB,ZB,YB等)数据的传输 (2)海量数据的存储(3)海量数据的计算

​ 常识:b—>B—>KB—>MB—>GB—>TB—>PB—>EB—>ZB—>YB等等

Hive:由Facebook开源用于解决海量结构化日志的数据统计

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能

Hive本身不存储数据,他就是提供了一种管理方式

本质是:将HQL转化成Map Reduce程序——>>好处:减少开发人员的学习成本,方便任务的运行,降低开发成本

Hive数据仓库踏坑(上)_第1张图片

1)Hive处理的数据存储在HDFS(Hive相当于Hadoop的客户端)

2)Hive分析数据底层的默认实现是Map Reduce(可以修改)

3)执行程序运行在Yarn上(资源调度)

**Hive优点:**Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合使用

​ Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

**Hive缺点:**Hive的HQL表达能力有限

​ (1)迭代式算法无法表达

​ (2)数据挖掘方面不擅长

​ Hive的效率比较低

​ (1)Hive的自动生成的Map Reduce(吞吐量大,但是速度比较慢)作业,通常情况下不够智能化

​ (2)Hive调优比窘困难,力度较粗

Hive架构原理

Hive数据仓库踏坑(上)_第2张图片

Hive数据仓库踏坑(上)_第3张图片

Hive和数据库比较

​ 除了查询语言类似,其他一切关系都没有(不要有什么联想)

​ HIve是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中的,而数据库可以将数据保存在块设备 或者本地文件系统中

​ Hive一次写入多次读出,在Hive中不建议对数据进行改写,所有的数据都是加载的时候确定好的

​ 数据库更多的是进行实时的增删改查。

​ Hive(处理数据量大)不能建立索引(计算引擎就是Map Reduce),查询的时候只能取扫描更多的(全盘)数据(比较暴 力),因此访问延迟比较高。数据库MySQL(处理数据量小)的计算引擎是InnoDB

北美大数据Hive笔记

  • 掌握Hive数据类型
  • 掌握Hive的数据库和表的操作
  • 掌握Hive的数据分区

理解Hive的数据分桶,视图(view)

0909,主要学DDL

将结构化的数据文件映射为数据库表

提供类SQL的查询语言HQL

主要是解决海量数据的结构化分析

Hive是Hadoop的客户端,HQL类SQL语法,简化MR开发。

  • 提供了简单的优化模型,支持在HDFS和HB上临时查询数据,
  • 支持用户自定义函数,格式。
  • 成熟的JDBC和ODBC驱动程序,用于ETL和BI(商业智能)
  • 稳定可靠(真实生产环境)的批处理,有庞大活跃的社区

工作中 工作效率+开发效率相互权衡。

Hive元数据管理

  • 记录数据仓库中模型的定义,各层级的映射关系

  • 存储在关系数据库中

    ​ 默认Derby(单用户单线程),轻量级内嵌SQL数据库

    ​ Derby非常适合测试和演示

    ​ 存储在.metastore_db目录中

    ​ 实际生产一般存储在MySQL中

    ​ 修改设置文件hive-site.xml

    • Hcatalog

      ​ 将Hive元数据共享给其他应用程序

    Hive数据仓库踏坑(上)_第4张图片

启动beeline服务

//用hive也可以 ,就是用这个好看,自动生成表格。
[root@sandbox-hdp ~]# beeline -u 'jdbc:hive2://localhost:10000/default'
//关闭
[root@sandbox-hdp ~]# lill -9

Hive数据仓库踏坑(上)_第5张图片

命令行模式:就是上面图片的第三条语句(两条语句使用一下)。不是交互式的

最右面的一整列都可以使用

Hive数据仓库踏坑(上)_第6张图片

Hive数据仓库踏坑(上)_第7张图片

使用环境

Hive数据仓库踏坑(上)_第8张图片

上面的图片有展现工具,Hive的jdbc工具。

CDH的用Hues HDP 适用于Ambari Hiew View

下载HUE界面,有图标界面。

Hive数据仓库踏坑(上)_第9张图片

Hive数据仓库踏坑(上)_第10张图片

Hive数据仓库踏坑(上)_第11张图片

上面加黑加粗为常用重点。(4个)

Hive数据仓库踏坑(上)_第12张图片

Hive数据仓库踏坑(上)_第13张图片

对于Hive的String类型相当于数据库中的varchar类型,给类型是一个可变的字符串,不过她不能声明其中最能存储多少个字符,理论上它可以存储2GB的字符数。

Hive数据类型 - 复杂数据类型

ARRAY:存储的数据卫星同数据类型
MAP:具有相同类型的键值队
STRUCT:封装了一组字段(结构体,跟业务相关,可以组成对象,取值的时候c.weight=2 c相当于列的名字)

Hive数据仓库踏坑(上)_第14张图片

Hive元数据存储结构

数据结构 描述 逻辑关系 物理存储(HDFS)
Database 数据库 表的结合 文件夹
Table 行数据集合 文件夹
Partition 分区 用于分割数据 文件夹
Buckts 分桶 用于分布数据 文件
Row 行记录 文件中的行
Columns 列记录 每行中指定的位置
Views 视图 逻辑给你按,可跨越多张表 不存储数据
Index 索引 记录统计数据信息 文件夹

分区Partition是在表的基础上取优化,

数据库(Database)

​ 表的集合,HDFS中表现为一种文件夹

​ 默认为在hive.metastore.warehouse.dir属性目录下

Hive数据仓库踏坑(上)_第15张图片

建库建表

0: jdbc:hive2://localhost:10000/default> create database if not exists myhivebook;
No rows affected (1.405 seconds)
0: jdbc:hive2://localhost:10000/default> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| foodmart       |
| myhivebook     |
| xademo         |
+----------------+--+
4 rows selected (0.546 seconds)
0: jdbc:hive2://localhost:10000/default> 

Hive中的注释:–我在你 。。。注释中不要出啊先分号(;)

数据表(内部表/外部表)

Hive数据仓库踏坑(上)_第16张图片

免面试题:Hive内部表和外部表概念?区别?最实用的场景?

Hive数据仓库踏坑(上)_第17张图片

第四章 DDL数据定义语言(库的增删改查以及表的增删改查)

创建数据库,数据库在HDFS上默认存储路径是/user/hive/warrehouse/*.db

//在hive中存放文件夹的路径 pwd查看根目录

[root@sandbox-hdp ~]# cd /home/hive/

//显示数据库
hive> show databases;
//使用 default 数据库
hive> use default;
//显示 default 数据库中的表
hive> show tables;
//删除已创建的 student 表
hive> drop table student;
//创建 student 表, 并声明文件分隔符’\t’
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS
TERMINATED
BY '\t';
//加载/opt/module/datas/student.txt 文件到 student 数据库表中。
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
//Hive 查询结果
hive> select * from student;
OK
1001 zhangshan
1002 lishi
1003 zhaoliu
Time taken: 0.266 seconds, Fetched: 3 row(s)

//创建数据库   名字为hive_db,默认路径为/user/hive/下面
hive> create database hive_db;
//创建数据库(要在数据库下面)
create database hive_db;
//指定目录下创建数据库(根目录)location
hive> create database hive_db2 location '/';
//创建一个表,默认路径是根路径下
create table hive_db.test(id int);
//查看所有数据库
hive> show databases;
//标准写法:if not exists,创建数据库的标准写法,防止出现名字相同
hive> create database if not exists hive_db;
OK
Time taken: 0.034 seconds
hive> 
//模糊查询:查询数据库的详情
hive> show databases like 'hive*';
OK
hive_db
hive_db2
Time taken: 0.035 seconds, Fetched: 2 row(s)
hive> 
//查询数据库的摸一个表
hive> desc database hive_db;
//显示数据库的详细信息,extended  显示额外信息;
hive> desc database extended db_hive;
//修改数据库,,,括号里面的相当于键值队类型
hive> alter database hive_db set dbproperties("CTtime"="2020-06-22");
OK
Time taken: 0.642 seconds
//查看更改后的粗狂信息
hive> desc database hive_db;
OK
hive_db		hdfs://sandbox-hdp.hortonworks.com:8020/apps/hive/warehouse/hive_db.db	root	USER	
Time taken: 2.64 seconds, Fetched: 1 row(s)
//查看修改后的详细信息
hive> desc database extended hive_db;
OK
hive_db		hdfs://sandbox-hdp.hortonworks.com:8020/apps/hive/warehouse/hive_db.db	root	USER	{CTtime=2020-06-22}
Time taken: 0.271 seconds, Fetched: 1 row(s)
//删除空数据库
hive>drop database db_hive;
//删除非空数据库(if exists判断数据库是否存在)
hive> drop database if exists db_hive2;
//如果数据库不为空,可采用cascade命令,强制删除
hive> drop database db_hive cascade;
//删除数据表
hive>drop table test;
//查看所有数据表
hive>show tables;
//查看所有数据库
hive>show databases;

如果数据库不为空,可采用cascade命令,强制删除

hive> drop database hive_db cascade;

创建数据表

//第一种方式
hive>create table student;
//第二种方式(有表结构和数据)
hive>create table student1 as select * from student;
//第三种方式(只有表结构没有表数据)
hive>create table student2 like student;
//查看某表的具体信息
hive>desc student;

创建表语法 CREATE TABLE

创建表
1.建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
[CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
2.字段解释说明
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异
常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向
实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删
除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY 创建分区表
(5)CLUSTERED BY 创建分桶表
(6)SORTED BY 不常用,对桶中的一个或多个列另外排序
(7)ROW FORMAT 
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS 
TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, 
property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW 
FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户
还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确
定表的具体的列的数据。
SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。
(8)STORED AS 指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、
RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使
用 STORED AS SEQUENCEFILE。 (9)LOCATION :指定表在 HDFS 上的存储位置。
(10)AS:后跟查询语句,根据查询结果创建表。 (11)LIKE 允许用户复制现有的表结构,但是不复制数据。
上传文件
//上传文件第一种
//load data local从本地上传和put一样
//load data 在HDFS文件移动
//into table emp   追加在这个文件后面(防止覆盖)
hive> load data local inpath '/home/hive/emp.txt' into table emp;
//上传文件第二种
[rootj@sandbox-hdp ~] hdfs dfs -put 本地路径 上传路径

类型转化

Hive的元子数据类型是可以进行隐式转换的,类似于Java的类型转换,如TINYINT可以转换成INT,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非转换成CAST操作。

(1)任何类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。

(2)所有整数类型,FLOAT和STRING类型都可以隐式地转换成DOUBLE。

(3)TINYINT,SMALLNT,INT都可以转换为FLOAT。

(4)BOOLEAN类型不可以转换为任何其他类型。

2,可以使用CAST操作显示进行数据类型转换。

​ 例如:CAST(‘1’ASINT)将把字符串‘1’转换成整数1;如果强制转换失败,如执行CAST(‘X’ASINT),表达式 返回空值NULL。

修改数据库,数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

管理表(就是内部表):因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置型hive.metastore.warehose.dir(例如:/user/hive/warehouse)所定义的目录下,当我们删除一个管理表时,Hive也会删除这个表中的数据。管理表不适合和其他工具共享数据。删除时:元数据和源数据全部删除。

内部表

//这个只能查看出字段,无法看出是内部表还是外部表
hive>desc student;
//查看表的详细信息extended
hive>desc extended student;
//查看是内部表还是外部表
hive> desc formatted student;
//创建数据库可以指定位置,创建表也可以指定位置


外部表:Hive并非完全拥有这份数据,删除该表并不会删掉这份数据,不过描述表的元数 据信息会被删掉。

管理表和外部表的使用场景

每天将收集到网站日志定期流入HDFS文本文件,在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表,结果表使用内部表存储,数据通过SELECT+INSET进入内部表。

//导入文件
[root@sandbox-hdp ~]# vi dept.txt
		
10   ACCOUNTING  1700
20   RESEARCH    1800
30   SALES       1900
40   OPERATIONS  1700
~                          

//创建一个部门表
hive> create external table dept(deptid int,dname string,loc int)
    > row format delimited fields terminated by '\t';
//创建一个员工表(外部表)
//导入文件
[root@sandbox-hdp ~]# vi emp.txt
7369   SMITH     CLERK     7902    1980-12-17    800.00    20
7499   ALLEN     SALESMAN  7698    1981-2-20     1600.00   300.00  30

//创建外部表(在删除表的时候,不会把元数据删除)
create table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';

hive> load data local inputh '/root/dept.txt' into table dept;
hive> load data local inputh '/root/emp.txt' into table emp;
hive> select * from dept;
hive> select * from emp;
//查看当前所有数据库
hive>show tables;


管理表与外部表的相互转换

管理表与外部表的互相转换
(1)查询表的类型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
(2)修改内部表 student2 为外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
(3)查询表的类型
hive (default)> desc formatted student2;
Table Type: EXTERNAL_TABLE
(4)修改外部表 student2 为内部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');
(5)查询表的类型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
注意:('EXTERNAL'='TRUE')('EXTERNAL'='FALSE')为固定写法,区分大小写!


分区表

分区表实际上就是对应一个HDFS文件上的独立的文件,该文件加下是该分区所有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定分区,这样查询效率会更高。

新建一个分区表

//创建一个分区表,名为stu_partition,对应的参数类型为id   int,name string类型
hive> create table stu_partition(id int,name string)
	//分割的 按列,还要指定列的类型
    > partitioned by(month string)//按月分区month string
    //行   格式    划定   自定义字段    以空格终止
    > rom format delimited fields terminated by '\t';
    
hive> show tables;//即可看见新创建的stu_partition分区表。
//往分区表里面加载数据
//加载数据load data
hive> load data local inpath '/home/hive/emp.txt' into table stu_partition 			     		partition(month="20200623");
hive> load data local inpath '/home/hive/emp.txt' into table stu_partition 					   partition(month="20200624");
hive> load data local inpath '/home/hive/emp.txt' into table stu_partition 					   partition(month="20200625");

//查看两个分区内容中的数据
hive> select * from stu_partition where month=20200625 or month=20200624;
//添加多个分区   中间需要用空格
hive> alter table stu_partition add partition(month="20200626") 								partition(month="20200627")//删除多个分区   中间需要用逗号
hive> alter table stu_partition drop 															partition(month="20200626"),partition(month="20200627");


[外链图片转存失败(img-LuDeTq70-1568646957760)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1568050239114.png)]

二级分区:

//创建二级分区表(就是制定了两个文件夹)
hive> create table stu2(id int,name string)
	//按照年月来划分
    > partitioned by(month string,day string)
    > row format delimited fields terminated by '\t';
//往二级分区表中添加数据   
hive> load data local inpath '/home/hive/emp.txt' into table stu2 
		//必须要指定分区
		//注意:分区字段(month="20200626",day="23")不能是表中(id int,name string)的字段
		partition(month="20200626",day="23");

把数据直接上传到分区目录上,让分区表和数据产生关系的三种方式

//第一种方法
//创建一个分区表
hive> dfs -mkdir -p /apps/hive/warehouse/stu_partition/month=20200626;
//往分区表中输入数据
hive> dfs -put /home/hive/emp.txt /apps/hive/warehouse/stu_partition/month=20200626;
//执行修复命令    修复repair              
hive> msck repair table stu_partition;
//查询分区表中的数据
hive> select * from stu_partition where month=20200626;

//第二种方法
hive> dfs -mkdir -p /apps/hive/warehouse/stu_partition/month=20200627;
hive> dfs -put /home/hive/emp.txt /apps/hive/warehouse/stu_partition/month=20200627;
//直接添加一个分区
hive> alter table stu_partition add partition(month=20200627);
hive> select * from stu_partition where month=20200627;

//第三种方法
//上传数据和load数据分区



修改表 增加/修改/替换列信息
//查看当前数据库里面的表
hive>show tables;
//修改数据表的名字  关键字:rename to
hive>alter table student2 rename to student3;
//查看是否更改成功
hive>show tables;
//更改表中的列名     关键字:change column       更改id
hive>alter table student3 change column id stu_id string;
//查看表中的列是否更该成功
hive>desc student3;
//添加列名字    关键字:add column()
hive>alter table student3 add column(desc string);
//替换所有的列名     关键字:replace columns()
hive>alter table student3 replace columns (id int,nu string,...一一对应)
//查看表数据
hive>desc student3;

第五章 DML数据的控制语言(数据的操作语言 )

//创建一张新的分区表
hive>create table student2(id int,name string)
	>row format delimited fields terminated by '\t';

	 向表中装载数据(Load) 
1.语法
//向新建表中导入数据   关键字 load data local inpath
hive> load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student 
[partition (partcol1=val1,…)];
(1)load data:表示加载数据
(2)local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表 
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区

特写:导入数据(into与overwrite)

(1)向表中装载数据(Load)
//从本地导入   就相当于移动到表里面
//第一种方式
//关键字:load data local inpath  '文件夹路径'  ovewrwrite into table  表名
hive> load data local inpath '/home/hive/emp.txt' overwrite into table student2;
//第二种方式  去掉overwrite
//into表示追加(在后面一直叠加)
hive> load data local inpath '/home/hive/emp.txt' into table student2;
//加上overwrite 表示覆盖(复写)
hive> load data local inpath '/home/hive/emp.txt' overwrite into table student2;


//从HDFS上的导入
//先把文件上传到HDFS上
[root@sandbox-hdp ~]# cd /home/hive/
[root@sandbox-hdp hive]# ls
create_table_script.hql  data_copyto_hdfs  dept.txt  derby.log  emp.txt  foodmart_data  foodmart_data.zip  __MACOSX
//移动到根目录下面
[root@sandbox-hdp hive]# hadoop fs -put emp.txt /

//回到hive界面   关键字:load data inoath '文件夹路径' into table 数据表名;
hive> load data inpath '/emp.txt' into table student2;
//查看数据表中的数据
hive> select * from student2;

(2)通过查询语句向表中插入数据(Insert)
//单表插入(基本表插入,根据单张表查询结果)
//stu2这张表是二级分区表   关键字:insert into table      partition()
hive> insert into table stu2 partition(month=202006,day=26)
    > select * from student2;
//查看stu2
hive> select * from stu2;



//多插入模式(根据多张表查询结果)
//如果查询语句都来自同一张表,则可以提前把表写在开头
hive> from student2
	>insert into table stu2 partition(month=202006,day=24)
	>select *
	>insert into table stu2 partition(month=202006,day=25)
	>select *;
//查询表stu2
hive>select * from stu2;


创建表时通过Location指定加载数据路径

//创建一个表,把数据导入表中
//用like创建相同的表
hive> create batle student1 like student2;
hive> dfs -put /home/hive/emp.txt /apps/hive/warehouse/student1;
hive> select * from student1;




//创建一个表
//数据已经存在集群了,我只需要对数据重新建表(外部表),
hive>dfs -mkdir -p /user/atguigu;
//把数据传递过来(指定已经有的位置上)
hive>dfs -put  /opt/module/datas/student.txt /user/adguigu;
hive>select * from student4;





1.上传数据到 hdfs 上
hive (default)> dfs -mkdir /student;
hive (default)> dfs -put /opt/module/datas/student.txt /student;
2. 创建表,并指定在 hdfs 上的位置
hive (default)> create external table if not exists student5(
id int, name string
)
row format delimited fields terminated by '\t'
location '/student; 3.查询数据
hive (default)> select * from student5;

Import数据到指定Hive表中

//进入表格 student
hive>import table student 
	//form 
	>from '/user/atguigu/export';

数据导出

1.Insert导出

(1)将查询的结果导出到本地
//这是走Map Reduce的
//将查询的结果导出到本地  关键字:insert(插入) overwrite(覆盖) local directory (本地目录)
hive> insert overwrite local directory '/apps/hive/warehouse/student1' 
	//"\t"结尾的行格式分段字段
    > row format delimited fields terminated by '\t'
    //用查询方式的结果作为条件(导入的内容)
    > select * from student1;

(2)将查询的结果导出到HDFS上(将数据导到HDFS)
//不需要local,  先在根目录下面创建student
hive> insert overwrite  directory '/student'
	//"\t"结尾的行格式分段字段
    > row format delimited fields terminated by '\t'
    //用查询方式的结果作为条件(导入的内容)
    > select * from student1;

(3) Hadoop 命令导出到本地
hive (default)> dfs -get /user/hive/warehouse/student/month=201709/000000_0 

				/opt/module/datas/export/student3.

(4)Hive Shell 命令导出
基本语法:(hive -f/-e 执行语句或者脚本 > file) 

[atguigu@hadoop102 hive]$ bin/hive -e 'select * from default.student;' > 

						  /opt/module/datas/export/student4.txt; 

(5)Export 导出到 HDFS
//
(defahiveult)> export table default.student 
			 //存放的路径,可以自动创建文件夹
			 > to '/user/hive/warehouse/export/student'; 

export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移。 

清除表中数据(这里指的是管理表)

//先查看数据表
hive>show tables;
//再查看数据表中的数据是否存在
hive>select * from student4;
//清除表中的数据
hive>truncate * from student4;
//查看是否清楚成功
hive>select * from student4;


查询 --(基本查询)

书写规范:(1)SQL语言不分大小写

​ (2)SQL可以在一行写也可以在多行写

​ (3)关键字不饿能被缩减也不能被拆分

​ (4)各句子一般要分行写

​ (5)使用缩进提高语句的可读性

​ (6) 长单词的列名选哟取别名

先加载一些数据
hive>load data local inpath '/opt/module/datas/dept.txt' intp table dept;

三者的区别:count(1) count(*) count(column)列
基本函数
hive> select count(*) from emp;
//求最大值  max   min   avg平均值   sum求和
hive> select max(sal) from emp;


Limit语句(典型的查询会返回多行数据,LiMIT子句用于限制返回的行数)
//限制查询的条数    关键字:limit
hive>select * from emp limit 5;

Where语句(就是一个过滤条件)

​ 1.使用WHERE子句,将不满足条件的行过滤掉、

​ 2.WHERE子句紧随FROM子句

​ 3.案例实操

//查询出薪水大于1000的所有员工
hive> select * from emp where sal > 1000;

比较运算符(Between/In/Is Null)

Like和RL ike

(1)使用LIKE原酸选择类似的值

(2)选择条件可以包含字符或数字

​ %代表零个或多个字符(任意个字符)。 _代表一个字符。

(3)RLIKE子句事Hive中这个功能的扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件

//查找薪水中含有2的员工信息       正则表达式
hive>select * from emp where sal RLIKE '[2]';

逻辑运算符(And–Or–Not)与–或--非

聚合函数:多(传入多行)变一(输出一行)

分组

Group BY语句

GROUP BY语句通常和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个分组执行局和操作。(如果不是聚合函数,则需要把字段放到group by里面)

(1)计算emp表每个部门平均工资

hive> selsect t.deptno,avg(t.sal) avg_sal from enp t group by t.demtno;

(2)计算emp每个部门中每个岗位的最高薪水

hive> aelect t.job,max(t.sal) max_sal from emp t group by t.deptno, t.job;

Having语句

1.having与where不同点

(1) where 针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
hive> select deptno,avg(sal) avg_sal from emp
    > group by deptno
    > having avg_sal > 2000;


等值 Join

Hive支持长常用的SQL JOIN语句,但是只支持等值连接,不i支持非等值连接。

实际案例:多表查询。
//根据员工表和部门表中的部门编号相等,查询员工编号,员工名称和部门名称。
hive>select e.empno,e.ename, d.deotno, d.dname 
	>from emp e join dept d 
	>on e.deptno = deptno;

内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e join dept d 
				on e.deptno = d.deptno;
左外连接
左外连接:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e left join dept d 
				on e.deptno = d.deptno;
右外连接
右外连接:JOIN 操作符右边表中符合 WHERE 子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e right join dept d 
				on e.deptno = d.deptno;
满外连接(所有数据)
满外连接:将会返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定字

段没有符合条件的值的话,那么就使用 NULL 值替代。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e full join dept d 
				on e.deptno = d.deptno;
多表连接
注意:连接 n 个表,至少需要 n-1 个连接条件。例如:连接三个表,至少需要两个连
接条件。
数据准备
1.创建位置表
create table if not exists location(loc int,loc_name string)
row format delimited fields terminated by '\t';
2.导入数据
hive (default)> load data local inpath '/opt/module/datas/location.txt' into table 
location;
3.多表连接查询




创建一张新表  
先给出txt文件
路径:cd /home/hive/
[root@sandbox-hdp hive]# vi location.txt;
1700    Beijing
1800    London
1900    Tokyo
~    
:wq

创建表的语句 创建位置表
create table if not exists location(
loc int,
loc_name string
)
row format delimited fields terminated by '\t';

把数据导入
hive> load data local inpath '/home/hive/location.txt' into table location;

查询一些导入的结果
hive> select * from location;

//多表查询开始

hive (default)>SELECT e.ename, d.dname, l.loc_name
				FROM emp e JOIN dept d
				ON d.deptno = e.deptno 
				JOIN location l
				ON d.loc = l.loc;
大多数情况下,Hive 会对每对 JOIN 连接对象启动一个 MapReduce 任务。本例中会首
先启动一个 MapReduce job 对表 e 和表 d 进行连接操作,然后会再启动一个 MapReduce job
将第一个 MapReduce job 的输出和表 l;进行连接操作。
注意:为什么不是表 d 和表 l 先进行连接操作呢?这是因为 Hive 总是按照从左到右的
顺序执行的。
优化:当对 3 个或者更多表进行 join 连接时,如果每个 on 子句都使用相同的连接键的
话,那么只会产生一个 MapReduce job。
6.4.8 笛卡尔积
1.笛卡尔集会在下面条件下产生
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
2.案例实操
hive (default)> select empno, dname from emp, dept;
6.4.9 连接谓词中不支持 or
hive join 目前不支持在 on 子句中使用谓词 or
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno
= d.deptno or e.ename=d.ename; 错误的

查看分区表的信息

//关键字:partitions
hive> show partitions stu_partition;

Import数据到指定Hive表中

​ 注意:先用export导出后,再将数据导入

分桶及抽样查询

分桶表数据存储

![[外链图片转存失败(img-XRcA1gwy-1568646957762)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1568076320381.png)](https://img-blog.csdnimg.cn/20190916232521888.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RUMTU3NTEwOTc1NzY=,size_16,color_FFFFFF,t_70)

named(常量) map(键值队) 等都是函数

分桶及抽样查询

分桶表数据存储
分区针对的是数据的存储路径,分桶针对的是数据文件。

**分区(文件夹上)**提供一个隔离数据何优化查询方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。(数据量大)

**分桶(文件上)**是将数据集分解成更容易管理的若干部分的另一个技术。(数据集很大的情况下)

适应杨(sampling)更高效,根据桶列进行哈希函数将数据进行分桶计算。
将一个文件拆成两个。
先创建分桶表,通过直接导入数据文件的方式
(1)数据准备
student.txt
(2)创建分桶表
create table stu_buck(id int, name string)
clustered by(id)
//准备放四个桶中
into 4 buckets
row format delimited fields terminated by '\t';
(3)查看表结构
hive (default)> desc formatted stu_buck;
Num Buckets: 4
(4)导入数据到分桶表中
hive (default)> load data local inpath '/opt/module/datas/student.txt' into table
stu_buck;
//查看是否建成
hive> show tables;

//向表中插入新值
hive> load data local unoath '/opt/data/文件名字' input tableu_buck 例句

map join可以使小表和大表广播。

Hive数据仓库踏坑(上)_第18张图片

创建两个桶,可以求模,抽样,可以求奇数偶数的

Hive数据仓库踏坑(上)_第19张图片

Hive视图(Views)

​ 试图概述

​ 通过隐藏子查询,连接和函数来简化查询逻辑结构

基于一个表查询(从一个表查数据)

​ 应用场景:将特定的列提供给用户,保护数据隐私,查询语句复杂的场景。

Hive数据仓库踏坑(上)_第20张图片

里面不存储数据,只存储快捷方式。如果原始数据修改时,试图就不能用了。

//如何知道查询的是表还是试图?
hive>desc formatted hive_db;

Hive侧视图 (lateral View)

Hive数据仓库踏坑(上)_第21张图片

多练习(后面会用到)

Hive数据仓库踏坑(上)_第22张图片

Hive数据仓库踏坑(上)_第23张图片

第二节

Hive数据仓库踏坑(上)_第24张图片

Hive数据仓库踏坑(上)_第25张图片

Hive数据仓库踏坑(上)_第26张图片

Hive数据仓库踏坑(上)_第27张图片

正则表达式要写在``里面。

Hive JOIN - 关联查询(JOIN为内链接) 等值 Join

Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持费等之连接

​ JOIN用于将两个或多个表中的行组合在一起查询

​ 内连接:INNER JION

​ 外连接:OUTER JOIN

​ 隐式连接:

​ 交叉连接:

虚拟列(Virtual Columns)
两个连续下划线,用于数据验证
INPUT__FILE__NAME:Mapper Task的输入文件名称
BLOCK__OFFSET__INSIDE__FILE:当前全局文件位置

案例实操

合并员工表和部门表
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e join dept d 
				on e.deptno = d.deptno;
内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e join dept d 
				on e.deptno = d.deptno;
左外连接
左外连接:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e left join dept d 
				on e.deptno = d.deptno;
右外连接
右外连接:JOIN 操作符右边表中符合 WHERE 子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e right join dept d 
				on e.deptno = d.deptno;
满外连接
满外连接:将会返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定字

段没有符合条件的值的话,那么就使用 NULL 值替代。
hive (default)> select e.empno, e.ename, d.deptno 
				from emp e full join dept d 
				on e.deptno = d.deptno;
多表连接
注意:连接 n 个表,至少需要 n-1 个连接条件。例如:连接三个表,至少需要两个连
接条件。
数据准备
1.创建位置表
create table if not exists location(loc int,loc_name string)
row format delimited fields terminated by '\t';
2.导入数据
hive (default)> load data local inpath '/opt/module/datas/location.txt' into table 
location;
3.多表连接查询
hive (default)>SELECT e.ename, d.dname, l.loc_name
				FROM emp e JOIN dept d
				ON d.deptno = e.deptno 
				JOIN location l
				ON d.loc = l.loc;
大多数情况下,Hive 会对每对 JOIN 连接对象启动一个 MapReduce 任务。本例中会首
先启动一个 MapReduce job 对表 e 和表 d 进行连接操作,然后会再启动一个 MapReduce job
将第一个 MapReduce job 的输出和表 l;进行连接操作。
注意:为什么不是表 d 和表 l 先进行连接操作呢?这是因为 Hive 总是按照从左到右的
顺序执行的。
优化:当对 3 个或者更多表进行 join 连接时,如果每个 on 子句都使用相同的连接键的
话,那么只会产生一个 MapReduce job。
6.4.8 笛卡尔积
1.笛卡尔集会在下面条件下产生
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
2.案例实操
hive (default)> select empno, dname from emp, dept;
6.4.9 连接谓词中不支持 or
hive join 目前不支持在 on 子句中使用谓词 or
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno
= d.deptno or e.ename=d.ename; 错误的

案例实操

​ (1)根据员工和部门表中的部门编号相等,查询员工编号,员工名称和部门名称;

//先给表取别名e d  员工编号e.empno  员工姓名e.ename    部门具体名称d.deptno      
hive>select e.empno, e.ename,d.deptno,d.dname 
	//来自于那张表  取别名   用join等值连接   
	>from emp e join dept d
	//字段on  
	>on e.deptno = d.deptno;

Hive数据仓库踏坑(上)_第28张图片

​ insert语句可以将数据插入表/分区。支持多表查询

Hive数据仓库踏坑(上)_第29张图片create table test(name string,age int)

inesrt into table test(name,age) valuses(‘zahngsan’,24)

inesrt into table test(name) valuses(‘wangwe’)

insert into table test(name) valuses(‘zahngsan’),(‘lisi’)

Hive数据插入

​ 使用insert语句将数据插入/导出到文件

​ 支持文件

-- 从同一数据源插入本地文件,hdfs文件,表
from ctas_employee
insert overwrite local directory '/tmp/out1'  select *
insert overwrite directory '/tmp/out1' select *
insert overwrite table employee_internal select *;
-- 以指定格式插入数据
insert overwrite directory '/tmp/out3'
row format delimited fields terminated by ','
select * from ctas_employee;
-- 其他方式从表获取文件
hdfs dfs -getmerge 


Hive数据排序 - ORDER BY

​ ORDER BY (ASC|DESC)类似于标准SQL

​ 只使用一个Reduce执行全局数据排序

​ 速度慢,应提前做好数据过滤

​ 支持使用CASE WHEN 或表达式

​ 支持按位置编号排序

​ set hive.groupby.orderby.position.alias=true;

select * from offers order by case when offerid = 1 then 1 else 0 end;
select * from offers order by 1;


模拟面试:排序时如何把NULL值排到最后面?

SOET BY 对每个Reduce中的数据进行排序

​ 当Reduce数量设置为1时,等于ORDER BY

​ 排序列必须与出现在SELECT column 列表中

DISTRLBUTE BY类似于标准SQL中的GROUP BY

​ 确保具有匹配列值的行备份渠道相同的Reducer

​ 不会对每个Reducer的输出行排序

​ 通常使用在SORT BY语句之前

SELECT department_id , name, employee_id, evaluation_score
FROM employee_hr 
DISTRIBUTE BY department_id SORT BY evaluation_score DESC;

Hive数据仓库踏坑(上)_第30张图片

Hive聚合运算 - 概述

​ GROUP BY 用于分组

​ Hive基于内置聚合函数与GROUP BY一起使用

​ 如果没有指定GROUP BY

使用内置聚合函数

Hive数据仓库踏坑(上)_第31张图片

Apache Hive函数及性能优化

explode一对多

Hive数据仓库踏坑(上)_第32张图片

UDF用户自定义函数

Hive函数分类

输入输出角度分类

​ 标准函数:一行数据中的一列或多列为数据,结果为单一的值

​ 据很函数:多行的零列到多列为输入,结果为单一的值

​ 表生成函数:

Hive数据仓库踏坑(上)_第33张图片

concat(name,’-’,24)多个字符串(string类型)连接

select year(‘2019-08-09’); regexp_replace(’’)

like创建表(由四种方法)

你可能感兴趣的:(Hive数据仓库踏坑(上))