大数据解三个问题:(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程序——>>好处:减少开发人员的学习成本,方便任务的运行,降低开发成本
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是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中的,而数据库可以将数据保存在块设备 或者本地文件系统中
Hive一次写入多次读出,在Hive中不建议对数据进行改写,所有的数据都是加载的时候确定好的
数据库更多的是进行实时的增删改查。
Hive(处理数据量大)不能建立索引(计算引擎就是Map Reduce),查询的时候只能取扫描更多的(全盘)数据(比较暴 力),因此访问延迟比较高。数据库MySQL(处理数据量小)的计算引擎是InnoDB
理解Hive的数据分桶,视图(view)
0909,主要学DDL
将结构化的数据文件映射为数据库表
提供类SQL的查询语言HQL
Hive是Hadoop的客户端,HQL类SQL语法,简化MR开发。
记录数据仓库中模型的定义,各层级的映射关系
存储在关系数据库中
默认Derby(单用户单线程),轻量级内嵌SQL数据库
Derby非常适合测试和演示
存储在.metastore_db目录中
实际生产一般存储在MySQL中
修改设置文件hive-site.xml
Hcatalog
将Hive元数据共享给其他应用程序
//用hive也可以 ,就是用这个好看,自动生成表格。
[root@sandbox-hdp ~]# beeline -u 'jdbc:hive2://localhost:10000/default'
//关闭
[root@sandbox-hdp ~]# lill -9
命令行模式:就是上面图片的第三条语句(两条语句使用一下)。不是交互式的
最右面的一整列都可以使用
CDH的用Hues HDP 适用于Ambari Hiew View
上面加黑加粗为常用重点。(4个)
对于Hive的String类型相当于数据库中的varchar类型,给类型是一个可变的字符串,不过她不能声明其中最能存储多少个字符,理论上它可以存储2GB的字符数。
数据结构 | 描述 | 逻辑关系 | 物理存储(HDFS) |
---|---|---|---|
Database | 数据库 | 表的结合 | 文件夹 |
Table | 表 | 行数据集合 | 文件夹 |
Partition | 分区 | 用于分割数据 | 文件夹 |
Buckts | 分桶 | 用于分布数据 | 文件 |
Row | 行 | 行记录 | 文件中的行 |
Columns | 列 | 列记录 | 每行中指定的位置 |
Views | 视图 | 逻辑给你按,可跨越多张表 | 不存储数据 |
Index | 索引 | 记录统计数据信息 | 文件夹 |
分区Partition是在表的基础上取优化,
表的集合,HDFS中表现为一种文件夹
默认为在hive.metastore.warehouse.dir属性目录下
建库建表
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内部表和外部表概念?区别?最实用的场景?
//在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;
创建表
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>desc student;
//查看表的详细信息extended
hive>desc extended student;
//查看是内部表还是外部表
hive> desc formatted student;
//创建数据库可以指定位置,创建表也可以指定位置
管理表和外部表的使用场景
每天将收集到网站日志定期流入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");
//创建二级分区表(就是制定了两个文件夹)
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;
//创建一张新的分区表
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:表示上传到指定分区
//从本地导入 就相当于移动到表里面
//第一种方式
//关键字: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;
//单表插入(基本表插入,根据单张表查询结果)
//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;
//创建一个表,把数据导入表中
//用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;
//进入表格 student
hive>import table student
//form
>from '/user/atguigu/export';
//这是走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;
//不需要local, 先在根目录下面创建student
hive> insert overwrite directory '/student'
//以"\t"结尾的行格式分段字段
> row format delimited fields terminated by '\t'
//用查询方式的结果作为条件(导入的内容)
> select * from student1;
hive (default)> dfs -get /user/hive/warehouse/student/month=201709/000000_0
/opt/module/datas/export/student3.
基本语法:(hive -f/-e 执行语句或者脚本 > file)
[atguigu@hadoop102 hive]$ bin/hive -e 'select * from default.student;' >
/opt/module/datas/export/student4.txt;
//
(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;
基本函数
hive> select count(*) from emp;
//求最大值 max min avg平均值 sum求和
hive> select max(sal) from emp;
//限制查询的条数 关键字:limit
hive>select * from emp limit 5;
1.使用WHERE子句,将不满足条件的行过滤掉、
2.WHERE子句紧随FROM子句
3.案例实操
//查询出薪水大于1000的所有员工
hive> select * from emp where sal > 1000;
(1)使用LIKE原酸选择类似的值
(2)选择条件可以包含字符或数字
%代表零个或多个字符(任意个字符)。 _代表一个字符。
(3)RLIKE子句事Hive中这个功能的扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件
//查找薪水中含有2的员工信息 正则表达式
hive>select * from emp where sal RLIKE '[2]';
聚合函数:多(传入多行)变一(输出一行)
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;
1.having与where不同点
hive> select deptno,avg(sal) avg_sal from emp
> group by deptno
> having avg_sal > 2000;
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;
注意:先用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(键值队) 等都是函数
**分区(文件夹上)**提供一个隔离数据何优化查询方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。(数据量大)
**分桶(文件上)**是将数据集分解成更容易管理的若干部分的另一个技术。(数据集很大的情况下)
先创建分桶表,通过直接导入数据文件的方式
(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 例句
创建两个桶,可以求模,抽样,可以求奇数偶数的
试图概述
通过隐藏子查询,连接和函数来简化查询逻辑结构
基于一个表查询(从一个表查数据)
应用场景:将特定的列提供给用户,保护数据隐私,查询语句复杂的场景。
里面不存储数据,只存储快捷方式。如果原始数据修改时,试图就不能用了。
//如何知道查询的是表还是试图?
hive>desc formatted hive_db;
正则表达式要写在``里面。
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;
insert语句可以将数据插入表/分区。支持多表查询
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
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聚合运算 - 概述
GROUP BY 用于分组
Hive基于内置聚合函数与GROUP BY一起使用
如果没有指定GROUP BY
使用内置聚合函数
explode一对多
UDF用户自定义函数
标准函数:一行数据中的一列或多列为数据,结果为单一的值
据很函数:多行的零列到多列为输入,结果为单一的值
表生成函数:
concat(name,’-’,24)多个字符串(string类型)连接
select year(‘2019-08-09’); regexp_replace(’’)
like创建表(由四种方法)