吐鲁番网站建设,linux网站做301重定向,最成功的网络营销案例,品牌产品策划方案基本概念
Hive是基于Hadoop的一个【数据仓库工具】#xff0c;可以将结构化和半结构化的数据文件映射为一张数据库表#xff0c;并提供简单的sql查询功能。
介绍
Hive本质是将SQL转换为MapReduce的任务进行运算#xff0c;底层由HDFS来提供数据存储#xff0c;简单来说H…基本概念
Hive是基于Hadoop的一个【数据仓库工具】可以将结构化和半结构化的数据文件映射为一张数据库表并提供简单的sql查询功能。
介绍
Hive本质是将SQL转换为MapReduce的任务进行运算底层由HDFS来提供数据存储简单来说Hive可以理解为一个将SQL转换为MapReduce的任务的工具甚至可以说Hive就是MapReduce客户端。
特点
可扩展性可以自由的扩展集群的规模一般情况下不需要重启服务。延伸性Hive支持自定义函数。容错即使节点出现错误SQL仍然可以完成执行。
优缺点
优点
操作接口采用类SQL语法提供快速开发的能力(简单、容易上手)。避免了去写MapReduce减少开发人员的学习成本。Hive的执行延迟比较高因此Hive常用于数据分析对实时性要求不高的场合。如果是实时可以建议使用Flink。Hive优势在于处理大数据对于处理小数据没有优势因为Hive的执行延迟比较高。Hive支持用户自定义函数用户可以根据自己的需求来实现自己的函数。集群可自由拓展并且具有良好的容错性节点出现问题SQL仍可完成执行。
缺点
Hive的HQL表达能力有限 代式算法无法表达。数据挖掘方面不擅长。 Hive的效率比较低 Hive自动生成的MapReduce作业通常情况下不够智能化。Hive调优比较困难粒度较粗。
架构
client
Hive允许clien连接的方式有三个Cli(Hive Shell)、JDBC/ODBC(Java访问hive)、WEBUI(浏览器访问Hive)。JDBC访问时中间件Thrift软件框架跨语言服务开发。DDL、DQL、DML整体仿写一套SQL语句。
Metastore
元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型 (是否是外部表)、表的数据所在目录等。
一般需要借助于其他的数据载体(数据库)。主要用于存放数据库的建表语句等信息。推荐使用Mysql数据库存放数据连接数据库需要提供: uri username password driver。
Driver
元数据存储在数据库中默认存在自带的derby数据库(单用户局限性)中推荐使用Mysql进行存储。
(1) 解析器(SQL Parser)将SQL字符串转换成抽象语法树AST这一步一般使用第三方工具库完成比如ANTLR对AST进行语法分析比如表是否存在、字段是否存在、SQL语义是否有误。
(2) 编译器Physical Plan将AST编译生成逻辑执行计划。
(3) 优化器Query Optimizer对逻辑执行计划进行优化。
(4) 执行器Execution把逻辑执行计划转换成可以运行的物理计划。对于Hive来说就是MR/Spark。
数据处理
Hive的数据存储在HDFS中计算由MapReduce完成。HDFSh和MapReduces是源码级别上整合两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
Hive交互方式
第一种
shell交互Hive用命令hive启动一个hive的shell命令行在命令行中输入sql或者命令来和Hive交互。
服务端启动metastore服务 nohup hive --service metastore /dev/null 21 进入命令 hive退出命令 quit;第二种
Hive启动为一个服务器对外提供服务其他机器可以通过客户端通过协议连接到服务器来完成访问操作这是生产环境用法最多的。
服务端启动hiveserver2服务 nohup hiveserver2 /dev/null 21 进入命令 1) 先执行beeline再执行 connect jdbc:hive2://node1:100002) 或者直接执行 beeline -u jdbc:hive2://node1:10000 -n root
退出命令行 exit第三种
使用-e参数来直接执行hql的语句
bin/hive -e use t_test;select * from test使用-f参数通过指定文本文件来执行hql的语句
hive -f hive.sqlhive cli和beeline cli的区别
metastore服务实际是一种thriftf服务通过它我们可以获取到hive元数据并且通过thrift获取原数据的方式屏蔽了数据库访问需要驱动url用户名密码等细节。HiveServer2是一个服务端接口使远程客户端可以执行对Hive的查询并返回结果。一般来讲我们认为HiveServer2是用来提交查询的也就是用来访问数据的。而MetaStore才是用来访问元数据的。beeline cli优化了命令行界面。
基本操作
Hive库操作
创建数据库
1、创建一个数据库数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db
create database shop;2、避免要创建的数据库已经存在错误增加if not exists判断
create database if not exists shop;创建数据库并指定位置
create database db_hive2 location /db_hive2.db修改数据库
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置健-值对属性值来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的包括数据库名和数据库所在的目录位置。
alter database db_hive set dbproperties(createtime 20210130)查看数据库详细信息
1、显示数据库(show)
show databases;2、可以通过like进行过滤
show databases like db_hive*;3、查看详情(desc)
desc database db_hive4、切换数据库
use db_hive删除数据库
1、最简写法
drop database db_hive;2、如果删除数据库不存在最好判断一下
drop database if exists db_hive2;3、如果数据库不为空使用cascade命令强制删除。
drop database db_hive cascade;Hive表操作
数据类型
data_type
primitive_type 基础数据类型array_type 数据类型 array data_typemap_type 键值类型 map primitive_type,data_typestruct_type 结构体 struct col_name:data_type [comment col_comment],… union_type 组合类型 uniontype data_type,data_type,…
primitive_type
tinyintsmallintintbigintbooleanfloatdoubledouble precisionstringbinarytimestampdecimaldecimal(precision,scale)datevarcharchar
创建表
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]CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在则抛出异常用户可以用IF NOT EXISTS选项来忽略这个异常。EXTERNAL 关键字可以让用户创建一个外部表在建表的同时指定实际数据的路径(LOCATION)Hive创建内部表时会将数据移动到数据仓库指定的路径(默认位置)r若创建外部表仅记录数据所在路径不对数据的位置做任何改变。在删除表的时候内部表的元数据和数据会被一起删除而外部表只删除元数据不删除数据(即可通过相同映射关系再次创建)。COMMENT 为表和列添加注释PARTITIONED BY 创建分区表CLUSTERED BY 创建分桶表SORTED BY 不常用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_nameproperty_value,property_nameproperty_value,…)]; 用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT或者ROW FORMAT DELIMITED将会使用自带的SerDe。在建表的时候用户还需要为表指定列用户在指定表的列的同时也会指定自定义的SerDeHive通过SerDeq确定表的具体的列的数据。SerDe是Serialize/Deserilize的简称目的就是用于序列化和反序列化。STORED AS 指定存储文件类型 常用的文件类型SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)。如果文件数据是纯文本可以使用 STORED AS TEXTFILE。如果数据需要压缩使用STORED AS SEQUENCEFILE。LOCATION 指定表在HDFS上存储位置。LIKE 允许用户复制现有的表结构但是不复制数据。
创建表案例
1、数据案例
{name:John,friends:[Anan,Cici],children:{Dave:19,Kanavi:20},address:{street:love rode,city:shaoxing}
}2、文本数据
John,Anan_Cici,Dave:19_Kanavi:20,love rode_shaoxing3、建表语句
create table if not exists t_person(name string,friends arraystring,children mapstring,int,address structstreet:string,city:string
)
row format delimited fields terminated by ,
collection items terminated by _
map keys terminated :
lines terminated by \n4、上传数据
# 将文本文件上传到HDFS
hdfs fs person.txt /data# 将文本数据load进数据表
load data inpath /data/person.txt into t_person修改表
显示表
show tables;
show tables like u;重命名
alter table old_table_name rename to new_table_name;增加/修改列信息
1、查询表结构
desc test_new;2、添加列
alter table test_new add columns (education string);3、更新列
alter table test_new change education educationnew string;删除表
drop table test_new;表与文件夹与文件
当我们创建好表的时候会在当前表所属的库中创建一个文件夹。当我们设置表路径的时候可以直接指向一个已有的路径,也可以直接去使用文件夹中的数据。当我们load数据的时候就会将数据文件存放到表对应的文件夹中。而且数据一旦被load就不能被修改。我们查询数据也是查询文件中的文件,这些数据最终都会存放到HDFS。当我们删除表的时候表对应的文件夹会被删除同时数据也会被删除。
Hive内部表(管理表)
# 创建表
create table if not exists person2(id int,name string) row format delimited fields terminated by \t stored as textfile location /user/person2# 根据查询结果创建表
create table person3 as select * from person2;# 根据已经存在的表结构创建表
create table person4 like person3;#查询表的类型
desc formatted person;Hive外部表
外部表说明
外部表因为是指其他的hdfs路径的数据加载到表中来所以hive会认为自己不完全独占这份数据删除hive表的时候数据仍然保存在hdfs中不会删除。
创建外部表
create external table if not exists person01(id int,name string
) row format delimited fields terminated by \t
location /data/useruser.txt放在user目录下
内部表和外部表相互转换
alter table person01 set talproperties(EXTERNAL TRUE)Hive载入数据
基本语法
load data # 加载数据
[local] # 本地不加Local就是从HDFS如果是HDFS将会删除原来的数据
inpath # 数据路径
/opt/module/data/student.txt # 具体路径
overwrite # 覆盖
into table # 加入到表
student # 表的名字
[partition(partcol1val1,...)] # 分区加载linuxb本地数据
load data local inpath data/test/ftp/dep.txt into table dept;从HDFS文件系统向表中加载数据(需要提前将数据上传到hdfsw文件系统中)
hadoop fs -put data/test/ftp/dep.txt /data/inner/RAW/01/empload data inpath /data/inner/RAW/01/emp/emp.txt into table emp加载数据并覆盖已有数据
load data inpath /data/inner/RAW/01/emp/emp.txt overwrite into table emp;非常不建议使用insert插入数据
Hive数据导出
将表中的数据备份 1、将查询结果存放到本地
//创建存放数据的目录
mkdir -p root/data//导出查询结果的数据
insert overwrite local directory /root/data/user01 select * from t_user;2、按照指定的方式将数据输出到本地
insert overwrite local directory /root/data/person
row format delimited fields terminated by ,
collection items terminated by -
map keys terminated by :
lines terminated by \n
select * from t_person;3、将查询结果输出到HDFS
//创建存放数据的目录
hdfs fs -mkdir -p /data/copy//导出查询结果数据
insert overwrite directory /data/copy/user
row format delimited fields terminated by ,
select * from user;4、直接使用HDFS命令保存表对应的文件夹
//创建存放数据的目录
hdfs fs -mkdir -p /data/copy//使用HDFS命令拷贝文件到其他目录
hdfs fs -cp /hive/warehouse/t_person/* /data/person5、将表结构和数据同时备份
1、将数据导出到HDFS
hdfs fs -mkdir -p /data/copy2、导出查询结果数据
export table t_user to /data/copy/user3、删除表结构
drop table t_user4、恢复表结构和数据
import from /data/copy/user