1.DDL数据库相关操作
- HiveSQL分为两部分DDL数据界说,DML数据操作
- 下述代码块中所有[]圈起来的操作都表示可选的操作
1.1创建数据库
- CREATE DATABASE [IF NOT EXISTS] database_name
- [COMMENT database_comment]
- [LOCATION hdfs_path]
- [WITH DBPROPERTIES (property_name=property_value, ...)];
复制代码
- COMMENT表示注释
- Location表示HDFS路径
- With dbproperties表示可以向数据库添加附加参数
- 案例如下所示:
注:若不指定路径,其默认路径为${hive.metastore.warehouse.dir}/database_name.db
1.2指定路径下创建数据库
1.3添加额外信息创建with dbproperties
- create database db_hive2
- with dbproperties ('name'='junchao');
复制代码 1.4查看数据库 结合like模糊查询
like查询可以使用通配符
*表示匹配任意个字符
|表示或的关系
2.查看某一个数据库的相关信息
2.1.如何查看数据库信息,extended可选
desc和describe结果相同
只有extended加入之后数据库才会展示parameters
2.2修改数据库
3.Hive基本数据类型
- 所有数据类型均小写
- string和varchar的区别,varchar(2000)需要指定长度例如2000不能超过65535,string不需要
- decimal表示小数10进度准度decimal(总位数,小数位数)
- 像decimal和varchar等需要传参的
4.复杂数据类型
- 建表建立一个字段的名称:array 表示该字段为数组类型,元素为string
- map和java同理,但是请注意小写;
- struct表示结构体,和JavaBean雷同。理解界说和取值即可。
5.类型转换
- 类型转换情景:
- int类型数据和bigint类型数据。
- 往一张表insert数据-类型不匹配可以转换
5.1类型隐士转换
- 仅学习规则即可
- 转换为参与运算的两个类型的最小转换类型
- 详细逻辑如上图所示,此中,横轴从左到右类型逐渐变大。
5.2类型显式转换
- cast函数做体现类型转换。
- string转int数据如下所示
- 固然注意事项,你这个字符必须是能转化为int类型的数据。
6.建表逻辑*
- row format关键字,可选,表示对每行数据进行序列化和反序列化
- stored as:指定文件格式,textfile(默认)、sequence file、orc file、parquet file.和底层的文件格式相关
- partitioned by
指定hive的分区字段
分区指的是hive一张表的数据按照你指定的分区字段将数据存储到不同的字段中。
只当分桶表
将hive一张表的数据分散的存储到多个文件中。
Hive的读流程:
Hive的写流程:
hive中任意一张表的建表语句都需要inputformat、outputformat、serializer
- stored as后面紧跟inputformat、outputformat
- row format重点:
- ROW FORAMT DELIMITED
- [FIELDS TERMINATED BY char]
- [COLLECTION ITEMS TERMINATED BY char]
- [MAP KEYS TERMINATED BY char]
- [LINES TERMINATED BY char]
- [NULL DEFINED AS char]
复制代码
- 1.delimited只要声明,hive就会默认对每行数据进行序列化和反序列化。
- delimited关键字可选一些分隔符
null值的存储格式;
配置null defined as ;默认值是\N
与上述delimited序列化方式不同,serde可以指定特定的序列化方式如json格式。也可以自界说序列化格式。
- row format serde serdename
复制代码
- 3.stored as 跟文件格式,hive底层可以直接进行映射例如textinputformat
当前章节仅了解即可, 后续详细讲解stored as等
7.CTAS建表
- CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
- [COMMENT table_comment]
- [ROW FORMAT row_format]
- [STORED AS file_format]
- [LOCATION hdfs_path]
- [TBLPROPERTIES (property_name=property_value, ...)]
- [AS select_statement]
复制代码 此处create 后面关键字仅有temporary
先前的可以指定external外部表等这是CTAS限定;
8.create table like建表
- 用户可以在一张已经存在的表上进行复刻,但是与先前的区别是此建表是没有数据的
- CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
- [LIKE exist_table_name]
- [ROW FORMAT row_format]
- [STORED AS file_format]
- [LOCATION hdfs_path]
- [TBLPROPERTIES (property_name=property_value, ...)]
复制代码 9.创建表应用案例
这个表创建时没有声明外部表,external
那么默认表示是内部表
仍然存在
- 练习2,serde和复杂数据类型
- 首先创建一个json格式文件
- 关于json格式文件存储格式,hive已经想好了,使用hive界说的JSON serde即可
- json一级字段格式要求和表的字段一致
- json的值和表的字段值要保持一致,可能使用到复杂数据类型。
- row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
复制代码
- 注意一下复杂数据类型即可
- myhadoop.json的文件格式肯定要是压平之后的文件格式。否则报错
- 别的服务器可以向hdfs上传任何后缀的文件,hive都能够辨认到,只要文件格式和当前界说保持一致即可
10.查看表语法
1.展示所有表
2.查看某一个表的详细信息
3.表的重定名 rename to
4.修改表的列信息
请你注意:
- 三种列的修改仅仅对表的元数据信息进行修改,而hdfs源文件不会进行修改,若有修改需求请你手动修改
- 新增列新增的column仅会追加到末端
替换列指的是将所有字段重新赋值,也就是所有column进行重新替换。
经验小结:
所有sql语句后面table 后面大多跟表明,可能和语法有关
上述修改表字段类型时,参考隐式转换,string式不能直接转int
如果非要string转int,可以使用hive提供的强转
- set hive.metastore.disallow.incompatible.col.type.changes=false;
复制代码
11.DML
- DML(data manipulate language)
- DML学习章节没有数据库删除语句,原因式hive是海量数据的分析盘算引擎,很少对数据进行删除操作。
1.Load
local指的是当前客户端向hdfs上 传文件
命令行客户端那么表示命令行当前节点
hiveserver2表示hiverserver2所在节点
可以多次into操作,表示追加
将hdfs路径下数据load
overwrite方式load数据
load从客户端load 文件时copy方式
hdfs load,是hdfs文件移动方式
2.Insert
into可以替换为overwrite
与load不同
load若进行覆盖写,那么直接overwrite into 或into
而insert 要么into 要么overwrite
此处注意的点是:values后面一个括号表示 要插入的一行数据
此处必须用overwrite而不能用into
local表示当地否则是hdfs路径
row format声明行格式或声明每一行序列化反序列化
stored as声明文件格式
3.export
4.import
我的临时实现不了,先暂定
12.Hive查询语句
- 默认ALL模式除非单独加入distinct
- select from where groupby having order by limit
- where是对每一行数据进行过滤
- having是对分组数据进行过滤
12.1关系运算函数
- where,having后面紧跟过滤条件,不可制止会跟关系运算函数
- between and关键字表示区间判断[a,b],同理between前面可以加入not达到相反的结果
- 判空操作用is null ,is not null,你就记着,null是string类型,以是is很合理。
- in 关键字和一个集合做判断,若在集合中,那么返回true
- like关键字模糊匹配,此处模糊和show后面的like表示不一样,show 后面的like可以用*表示全部,此处平替为了%
- 注意一下正则匹配rlike regexp
12.2聚合函数*
- 将多行数据进行聚合到一行进行盘算如count
- 语法
- count(*)统计总行数不会忽略null
- count(1)统计非Null总行数
COUNT(*) 会对所有列进行查抄(即使不会读取实际列值),以确保行的存在性。
COUNT(1) 只会查抄一列的存在性或用虚拟列来替换。
性能上count(1)略微高效
- Count(id)此用法和count(1)一样,id可能为空因此不会统计在内
- 盘算最大值,max聚合函数要放到select后面而不是过滤条件处
- min聚合函数与count相同
- 均匀值avg()同
12.3 group by
- 案例需求,我如今想要做更为复杂的统计 ,此处肯定不能count
固然你直接将job进行分组后还是要统计行数的
因此需要和count(*)一起使用。
老师精讲:分组聚合做的第一部将group by应用到用户指定的字段例如job,然后使用你指定的聚合函数对每一组进行统计等。
细节:
hive语法规定,你使用了分组聚合那么就不能在select查询分组以外的数据了
having专门对group by进行过滤。
13.Join语句
- 多张表进行横向拼接成一个宽表
- join操作会生成一张虚拟表,此表包括join表的所有字段。固然deptno两张表都有,因此虚拟表都会存在
直接在join完成的虚拟表进行分组聚合操作即可
等值毗连,非等值毗连(非等值毗连不常用 )
DG快捷键,格式化当前sql代码;
ctrl shift enter
内毗连
外毗连
左外,右外毗连,端外毗连,多表毗连,笛卡尔毗连,联合
1.默认情况下单写一个join表示内毗连。
2.只有进行毗连的两个表中都存在与毗连条件相匹配的数据才会被保存下来。
- select
- e.empno,
- e.ename,
- d.deptno
- from emp e
- join dept d
- on e.deptno = d.deptno;
复制代码
内毗连实现的结果就是二者毗连条件的公共字段被返回
- select
- e.empno,
- e.ename,
- d.deptno
- from emp e
- left join dept d
- on e.deptno = d.deptno;
复制代码 左外毗连
- 行返回的是左表的全部行
- 列返回的是左右量表的全部列
- 关于毗连条件d表能够匹配上e表就直接返回,如果没有匹配上返回null
返回的行是右表的所有行,列是所有列
注意:若单join默认就是内毗连,left join,right join,full join默认就是外毗连
- 满外毗连
- full join 或 full outer join
返回所有行所有列,没匹配上返回null
- 笛卡尔积(慎用)
- ab两个表粉笔m,n行数据,进行笛卡尔积操作,a表的每一行作为k与b表的每一行进行join关联
- 出现笛卡尔积的情况
- 内毗连不写毗连条件
- 毗连条件无效 例如on 1=1;
- 特别写法
- select * from emp,location
复制代码
14.Union
- Join将两个表的数据进行横向的拼接,而Union是将两个表的数据进行纵向拼接
- 上下两表union的前置要求
- union毗连两个查询语句
- Union注意事项
- 1.毗连的必须是select查询语句,不能表union表
- 2.字段名不一致不影响union,只要字段个数,字段类型对应即可。字段名不一致,最终返回结果的字段名取第一个表界说的字段名;
- 3.union和union all都是上下拼接sql的结果,这点是和join有区别的,join是左右关联,union和union all是上下拼接。union去重,union all不去重。
15.Order by排序
- -- 15.按照工资升序排序
- select * from emp
- order by sal;
复制代码
- -- 15.按照工资升序排序
- select * from emp
- order by sal desc;
复制代码
- 注意:生产环境Order by是高危操作,可以看一下底层执行计划
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |