一. Hive是什么 Hive是一个基于Hadoop的数据仓库平台。通过hive,我们可以方便地进行ETL的工作。hive定义了一个类似于SQL的查询语言:HQL,能 够将用户编写的QL转化为相应的Mapreduce程序基于Hadoop执行。 Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类sql的查询功能。
二.Hive的执行过程 1.hive的核心是驱动引擎:
Hive处理的数据存储在hdfs文件 Hive分析数据底层是mapreduce 执行程序运行在yarn上。 mapreduce是第一代计算引擎,Tez和spark是第二代。由于hive在mapreduce上运行速度很慢,于是用impala、presto、Drill等交互sql引擎解决mapreduce引擎太慢的问题,但是效果还是一般。 hive on tez/spark和sparksql取代mapreduce,来跑sql。
优点: (1)操作接口采用类sql语法,提供快速开发的能力 (2)避免了去写mapreduce,减少开发人员的学习成本。 (3)Hive的执行延迟比较高,因此hive常用于数据分析,对实时性要求不高的场合。 (4)Hive的优势处理大数据,对于数据小的没有优势,因为hive的执行延迟比较高 (5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点: (1)hql的表达有限,迭代式计算无法表达,数据挖掘方面不擅长 (2)hive的效率比较低,hive自动生成mapreduce作业,不够智能化。Hive调优比较困难,颗粒较粗。
三.Hive创建数据表
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]
创建数据表解释说明:
1、 CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。hive中的表可以分为内部表(托管表)和外部表,区别在于,外部表的数据不是有hive进行管理的,也就是说当删除外部表的时候,外部表的数据不会从hdfs中删除。而内部表是由hive进行管理的,在删除表的时候,数据也会删除。一般情况下,我们在创建外部表的时候会将表数据的存储路径定义在hive的数据仓库路径之外。hive创建表主要有三种方式,第一种直接使用create table命令,第二种使用create table ... as select...(会产生数据)。第三种使用create
table tablename like exist_tablename命令。
2、 EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
3、 LIKE 允许用户复制现有的表结构,但是不复制数据。
4、 ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAPKEYS 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 确定表的具体的列的数据。
数据切分格式:ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘/’ 按照换行切割每个字段之间由[ , ]分割
ITEMS TERMINATED BY '-'第三个字段是K-V形式,每组K-V对内部由[ : ]分割,每组K-V对之间由[ - ]分割
5、 STORED AS
SEQUENCEFILE | TEXTFILE | RCFILE
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用STORED AS
SEQUENCEFILE。
创建表的时候,hive文件存储格式有五种:列式存储和行式存储
1)、TEXTFILE:默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。行存储(一行一行存储)。数据不做压缩,磁盘开销大,数据解析开销大。
2)、SEQUENCEFILE:以<key,value>的形式序列化到文件中;存储方式:行存储;可分割 压缩;
3)、RCFILE:列存储
4)、ORCFILE(0.11以后出现):数据按行分块 每块按照列存储;压缩快 快速列存取;效率比rcfile高。Orc文件有一个至多个stripe组成,每个stripe250MB大小。
5)、PARQUET:类似于orc,该文件以二进制的方式存储的。使用该方法存储数据的时候会按照block大小设置行组的大小,每一个mapper任务处理数据的最小单位是block,这样可以把每一行组由一个mapper任务处理,增大任务的执行并行度。该文件中有三种类型的页:数据页、字典页、索引页。索引页还不支持。
SEQUENCEFILE,RCFILE,ORCFILE,PARQUET格式的表不能直接从本地文件导入数据,数据必须要先导入到textfile格式的表中,
然后再从表中用insert导入SequenceFile,RCFile,ORCFile,PARQUET表中。
性能耗时来说:ORCfile <parquet <RCFILE<textfile,ORCFILE最优
Orc和压缩:orc默认压缩为zlib压缩,比snappy压缩的小,但是速率snappy高,一般都会运用到。实际开发会运用orc和parquet的多一些
Stored as orc tblproperties(“orc.compress”=”SNAPPY”)
–压缩
6、CLUSTERED BY
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是
针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
分区分的是文件夹,分桶分的是文件。
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接
(Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
7.ROW FORMAT
DELIMITED代表一行是一条记录,是自己创建的全部字段和文件的字段对应,一行对应一条记录。
8.分区表实际上就是对应hdfs文件系统上的独立的文件夹,该文件夹下是该分区的所有的数据文件,hive中的分区就是分目录。
运用在每天日志上、创建的分区表、加载数据到分区表中。
如加载数据到分区:Hive>load data local
inpath ‘/’ into table a patition(b=”20210101”)
加分区:Hive>alter table a add partition(b=’20210102’) partition(b=’20210103’);
Drop —是删除分区
存在二级分区:create table a(b int,c string) patitioned by(month string,date string);
创建分区要指定类型;分桶不用指定类型,字段分桶。
往已经存在的分区中加载数据:
>dfs –mkdir –p [表的路径]/month=”2021-01-01”;
>dfs –put [文件数据的路径] [分区路径]
或者:load加载
修复分区表:
>msck repair table a;
导入Load语法:
Load data [local] inpath ‘’ overwrite |
into table student [partition ]
import table a partition(b=’20210101’) from
[文件目录路径];
导出:
1) insert overwrite local
directory [路径] row format delimited fields terminated by ‘\t’ select * from a;
2) hadoop命令:dfs –get [] []
3) shell命令:
4) export:export table a to [];
5) sqoop
清空表:Truncate table a ——只会清空内部表(管理表)
9.针对分桶:
有关分区、分桶的区别:分区针对的是数据的存储路径、分桶针对的是数据文件。分桶表很少用。分区提供一个隔离数据和优化查询的便利方式,不过,并非所有的数据集都可以形成合理的分区,尤其找不到合适的划分时。分桶是将数据集分解成更容易管理的若干部分,是对大数据量表来说的。使用clustered by [字段]。
才创建分桶表时,要设置属性,不然创建好分桶表后,load或insert数据后只有一个分桶文件。有多少个reducer就有多少个文件生成。
创建分桶前设置:
>set hive.enforce.bucketing = true;
>set mapreduce.job.reduces=-1
分桶抽样:针对非常大的数据集,用户只需要抽取一些数据结果查看
Select * from a tablesample(bucket x out of y on 【分桶字段】);
一共四个桶,y=2,则是抽取4/2个桶;x指的是从哪个桶开始抽。
|