Hive学习总结
一、Hive基本概念
Hive:由Facebook开源用于解决海量结构化日志的数据统计工具。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
本质是:将HQL转化成MapReduce程序
1)Hive处理的数据存储在HDFS
2)Hive分析数据底层的实现是MapReduce
3)执行程序运行在Yarn上
1.优点
1) 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
2) 避免了去写MapReduce,减少开发人员的学习成本。
3) Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
4) Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
5) Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
2.缺点
2.1 Hive的HQL表达能力有限
(1)迭代式算法无法表达
(2)数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。
2.2 Hive的效率比较低
(1)Hive自动生成的MapReduce作业,通常情况下不够智能化
(2)Hive调优比较困难,粒度较粗
3.架构原理
1.用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
2.元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
3.Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
4.驱动器:Driver
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
二、Hive数据类型
1.基本数据类型
Hive数据类型 |
Java数据类型 |
长度 |
例子 |
TINYINT |
byte |
1byte有符号整数 |
20 |
SMALINT |
short |
2byte有符号整数 |
20 |
INT |
int |
4byte有符号整数 |
20 |
BIGINT |
long |
8byte有符号整数 |
20 |
BOOLEAN |
boolean |
布尔类型,true或者false |
TRUE FALSE |
FLOAT |
float |
单精度浮点数 |
3.14159 |
DOUBLE |
double |
双精度浮点数 |
3.14159 |
STRING |
string |
字符系列。可以指定字符集。可以使用单引号或者双引号。 |
‘now is the time’ “for all good men” |
TIMESTAMP |
时间类型 |
||
BINARY |
字节数组 |
对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。
2.集合数据类型
数据类型 |
描述 |
语法示例 |
STRUCT |
和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 |
struct() 例如struct<street:string, city:string> |
MAP |
MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 |
map() 例如map<string, int> |
ARRAY |
数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 |
Array() 例如array<string> |
Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
实例↓
创建本地测试文件test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
注意:MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符表示,这里用“_”。
Hive上创建表test
0: jdbc:hive2://hadoop102:10000> create table test( 0: jdbc:hive2://hadoop102:10000> name string, 0: jdbc:hive2://hadoop102:10000> friends array<string>, 0: jdbc:hive2://hadoop102:10000> children map<string, int>, 0: jdbc:hive2://hadoop102:10000> address struct<street:string, city:string> 0: jdbc:hive2://hadoop102:10000> ) 0: jdbc:hive2://hadoop102:10000> row format delimited fields terminated by ',' 0: jdbc:hive2://hadoop102:10000> collection items terminated by '_' 0: jdbc:hive2://hadoop102:10000> map keys terminated by ':' 0: jdbc:hive2://hadoop102:10000> lines terminated by '\n';
字段解释:
row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ':' -- MAP中的key与value的分隔符
lines terminated by '\n'; -- 行分隔符
导入文本数据到测试表
hive (default)> load data local inpath ‘/opt/module/datas/test.txt’into table test
访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
0: jdbc:hive2://hadoop102:10000> select friends[1],children['xiao song'],address.city from test where name ="songsong"; +-------+------+----------+--+ | _c0 | _c1 | city | +-------+------+----------+--+ | lili | 18 | beijing | +-------+------+----------+--+ 1 row selected (0.221 seconds)
三、DDL数据定义
3.1创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)];
数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db。
3.2查看数据库详情
1.显示数据库信息
hive> desc database db_hive; OK db_hive hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER
2.显示数据库详细信息,extended
hive> desc database extended db_hive; OK db_hive hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER
3.3 创建表
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]
字段解释说明
(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允许用户复制现有的表结构,但是不复制数据。
1.管理表
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
2.外部表
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
管理表与外部表的互相转换
(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')为固定写法,区分大小写!
3.分区表
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
1)创建分区表语法
0: jdbc:hive2://hadoop102:10000> create table dept_partition( 0: jdbc:hive2://hadoop102:10000> deptno int, dname string, loc string 0: jdbc:hive2://hadoop102:10000> ) 0: jdbc:hive2://hadoop102:10000> partitioned by (month string) 0: jdbc:hive2://hadoop102:10000> row format delimited fields terminated by '\t';
2)插入数据
0: jdbc:hive2://hadoop102:10000> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='202003'); INFO : Loading data to table tee.dept_partition partition (month=202003) from file:/opt/module/datas/dept.txt INFO : Partition tee.dept_partition{month=202003} stats: [numFiles=1, numRows=0, totalSize=71, rawDataSize=0] No rows affected (0.973 seconds) 0: jdbc:hive2://hadoop102:10000> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='202002'); INFO : Loading data to table tee.dept_partition partition (month=202002) from file:/opt/module/datas/dept.txt INFO : Partition tee.dept_partition{month=202002} stats: [numFiles=1, numRows=0, totalSize=71, rawDataSize=0] No rows affected (0.731 seconds) 0: jdbc:hive2://hadoop102:10000> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='202001'); INFO : Loading data to table tee.dept_partition partition (month=202001) from file:/opt/module/datas/dept.txt INFO : Partition tee.dept_partition{month=202001} stats: [numFiles=1, numRows=0, totalSize=71, rawDataSize=0] No rows affected (0.788 seconds)
如图
3)单分区查询
0: jdbc:hive2://hadoop102:10000> select * from dept_partition where month = '202003'; +------------------------+-----------------------+---------------------+-----------------------+--+ | dept_partition.deptno | dept_partition.dname | dept_partition.loc | dept_partition.month | +------------------------+-----------------------+---------------------+-----------------------+--+ | 10 | ACCOUNTING | 1700 | 202003 | | 20 | RESEARCH | 1800 | 202003 | | 30 | SALES | 1900 | 202003 | | 40 | OPERATIONS | 1700 | 202003 | +------------------------+-----------------------+---------------------+-----------------------+--+ 4 rows selected (0.82 seconds)
4)多分区查询
0: jdbc:hive2://hadoop102:10000> select * from dept_partition where month='202002' 0: jdbc:hive2://hadoop102:10000> union 0: jdbc:hive2://hadoop102:10000> select * from dept_partition where month='202003' 0: jdbc:hive2://hadoop102:10000> union 0: jdbc:hive2://hadoop102:10000> select * from dept_partition where month='202001'; INFO : Number of reduce tasks not specified. Estimated from input data size: 1 INFO : In order to change the average load for a reducer (in bytes): INFO : set hive.exec.reducers.bytes.per.reducer=<number> INFO : In order to limit the maximum number of reducers: INFO : set hive.exec.reducers.max=<number> INFO : In order to set a constant number of reducers: INFO : set mapreduce.job.reduces=<number> INFO : number of splits:2 INFO : Submitting tokens for job: job_1585055784337_0003 INFO : The url to track the job: http://hadoop103:8088/proxy/application_1585055784337_0003/ INFO : Starting Job = job_1585055784337_0003, Tracking URL = http://hadoop103:8088/proxy/application_1585055784337_0003/ INFO : Kill Command = /opt/module/hadoop-2.7.4/bin/hadoop job -kill job_1585055784337_0003 INFO : Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 1 INFO : 2020-03-25 00:04:07,057 Stage-1 map = 0%, reduce = 0% INFO : 2020-03-25 00:04:19,579 Stage-1 map = 50%, reduce = 0%, Cumulative CPU 3.21 sec INFO : 2020-03-25 00:04:21,900 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 6.36 sec INFO : 2020-03-25 00:04:29,718 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 10.04 sec INFO : MapReduce Total cumulative CPU time: 10 seconds 40 msec INFO : Ended Job = job_1585055784337_0003 INFO : Number of reduce tasks not specified. Estimated from input data size: 1 INFO : In order to change the average load for a reducer (in bytes): INFO : set hive.exec.reducers.bytes.per.reducer=<number> INFO : In order to limit the maximum number of reducers: INFO : set hive.exec.reducers.max=<number> INFO : In order to set a constant number of reducers: INFO : set mapreduce.job.reduces=<number> INFO : number of splits:2 INFO : Submitting tokens for job: job_1585055784337_0004 INFO : The url to track the job: http://hadoop103:8088/proxy/application_1585055784337_0004/ INFO : Starting Job = job_1585055784337_0004, Tracking URL = http://hadoop103:8088/proxy/application_1585055784337_0004/ INFO : Kill Command = /opt/module/hadoop-2.7.4/bin/hadoop job -kill job_1585055784337_0004 INFO : Hadoop job information for Stage-2: number of mappers: 2; number of reducers: 1 INFO : 2020-03-25 00:04:46,436 Stage-2 map = 0%, reduce = 0% INFO : 2020-03-25 00:05:05,903 Stage-2 map = 100%, reduce = 0%, Cumulative CPU 13.36 sec INFO : 2020-03-25 00:05:18,364 Stage-2 map = 100%, reduce = 100%, Cumulative CPU 17.86 sec INFO : MapReduce Total cumulative CPU time: 17 seconds 860 msec INFO : Ended Job = job_1585055784337_0004 +-------------+-------------+----------+------------+--+ | _u3.deptno | _u3.dname | _u3.loc | _u3.month | +-------------+-------------+----------+------------+--+ | 10 | ACCOUNTING | 1700 | 202001 | | 10 | ACCOUNTING | 1700 | 202002 | | 10 | ACCOUNTING | 1700 | 202003 | | 20 | RESEARCH | 1800 | 202001 | | 20 | RESEARCH | 1800 | 202002 | | 20 | RESEARCH | 1800 | 202003 | | 30 | SALES | 1900 | 202001 | | 30 | SALES | 1900 | 202002 | | 30 | SALES | 1900 | 202003 | | 40 | OPERATIONS | 1700 | 202001 | | 40 | OPERATIONS | 1700 | 202002 | | 40 | OPERATIONS | 1700 | 202003 | +-------------+-------------+----------+------------+--+ 12 rows selected (87.011 seconds)
4.DML数据操作
4.1 向表中装载数据(Load)
1.语法
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:表示上传到指定分区
2.实操案例
(0)创建一张表
hive (default)> create table student(id string, name string) row format delimited fields terminated by '\t';
(1)加载本地文件到hive
hive (default)> load data local inpath '/opt/module/datas/student.txt' into table default.student;
(2)加载HDFS文件到hive中
hive (default)> dfs -put /opt/module/datas/student.txt /user/atguigu/hive; hive (default)> load data inpath '/user/atguigu/hive/student.txt' into table default.student;
(3)加载数据覆盖表中已有的数据
上传文件到HDFS
hive (default)> dfs -put /opt/module/datas/student.txt /user/atguigu/hive;
加载数据覆盖表中已有的数据
hive (default)> load data inpath '/user/atguigu/hive/student.txt' overwrite into table default.student;
通过查询语句向表中插入数据(Insert)
基本模式插入(根据单张表查询结果)
hive (default)> insert overwrite table student partition(month='201708') select id, name from student where month='201709';
insert into:以追加数据的方式插入到表或分区,原有数据不会删除
insert overwrite:会覆盖表或分区中已存在的数据
注意:insert不支持插入部分字段
查询语句中创建表并加载数据(As Select)
根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student3 as select id, name from student;
创建表时通过Location指定加载数据路径
创建表,并指定在hdfs上的位置
hive (default)> create external table if not exists student5( id int, name string ) row format delimited fields terminated by '\t' location '/student;
4.2 数据导出
Insert导出
1.将查询的结果导出到本地
hive (default)> insert overwrite local directory '/opt/module/datas/export/student' select * from student;
2.将查询的结果格式化导出到本地
hive(default)>insert overwrite local directory '/opt/module/datas/export/student1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;
3.将查询的结果导出到HDFS上(没有local)
hive (default)> insert overwrite directory '/user/atguigu/student2' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;
5.其他重点
1.Limit语句
2.分桶表
3.行转列、列转行
4.窗口函数over()
5.Rank
6.文件存储格式
原文地址:https://www.cnblogs.com/g-cl/p/12558754.html
- jquery的html,text,val
- Redis Cluster日常操作命令梳理
- MongoDB数据存储-深入了解
- Linux下通过受限bash创建指定权限的账号
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (上)
- MongoDB副本(一主一备+仲裁)环境部署记录
- 根据前后的子串求中间串的函数
- Centos6下zookeeper集群部署记录
- 抓取百度指数引发的图像数字识别
- 真正将标注文字遮盖的方法
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (中)
- li浮动时ul高度为0,解决ul自适应高度的几种方法
- 使用正则表达式求完整路径中的文件名
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (下)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端单元测试那些事
- 前端Nginx那些事
- 前端运维部署那些事
- 《前端那些事》从0到1开发简单脚手架
- CDH7.1.1启用Kerberos
- 持续代码质量管理-SonarQube Scanner部署 2.1. 软件安装2.2. 配置修改
- 《前端那些事》聊聊前端的按需加载
- 直播带货系统,滚动视图,上滑隐藏,下滑显示
- 持续代码质量管理-SonarQube-7.3简单使用 2.1. 查看配置2.2. 质量检测2.3. 浏览器查看
- 安装指定版本的docker服务
- 你学BFF和Serverless了吗
- 如何使用Java连接Kerberos的Phoenix
- docker swarm的常用操作
- 组件库源码中这些写法你掌握了吗?
- spark-2.4.0-hadoop2.7-安装部署 4.1. Spark安装4.2. 环境变量修改4.3. 配置修改4.4. 分发到其他机器4.5. 启动spark