0


大数据之Hive基础

B站尚硅谷hive学习视频整理,用于自查

文章目录

1.什么是hive

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。本质是将HQL转化为MapReduce

2.Hive优缺点

  • 优点: 1)操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。 2)避免了去写 MapReduce,减少开发人员的学习成本。 3)Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。 4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。 5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
  • 缺点 1)Hive 的 HQL 表达能力有限 2)Hive 的效率比较低

3.hive和数据库比较

1)查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。
2)数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的(一次写入,多次查询)。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修改数据。
3)执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
4)数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

4.hive常用交互命令

1)“-e”不进入 hive 的交互窗口执行 sql 语句

hive -e "select id from student;"

2)“-f”执行脚本中 sql 语句并将结果写入txt文件中

 bin/hive -f /opt/module/hive/datas/hivef.sql > /opt/module/datas/hive_result.txt

3)退出

exit;

4)在 hive cli 命令窗口中如何查看 hdfs 文件系统

hive(default)>dfs -ls /;

5)查看在 hive 中输入的所有历史命令

  • 进入到当前用户的根目录 /root 或/home/atguigu
  • 查看. hivehistory 文件
cat .hivehistory

5.hive数据类型

  • 基本数据类型 tinyint /smallint /INT/ BIGINT/ BOOLEAN / FLOAT /DOUBLE/ STRING/decimal/varchar/ TIMESTAMP /BINARY
  • 集合数据类型 STRUCT/MAP/ARRAY

STRUCT和 c 语言中的 struct 类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是 struct<first:STRING, last:STRING>,那么第 1 个元素可以通过字段struct.first 来引用。

6.将文件数据load到hive表中

(1)假设某表有如下一行,我们用 JSON 格式来表示其数据结构。在 Hive 下访问的格式为

{
 "name": "songsong",
 "friends": ["bingbing" , "lili"] , //列表 Array, 
 "children": { //键值 Map,
     "xiao song": 18 ,
     "xiaoxiao song": 19
 }
 "address": { //结构 Struct,
     "street": "hui long guan",
     "city": "beijing"
 }
}

2)基于上述数据结构,我们在 Hive 里创建对应的表,并导入数据。创建本地测试文件 test.txt

{"name": "songsong", "friends": ["bingbing" , "lili"] , "children": { "xiao song": 18 ,"xiaoxiao song": 19}"address": {"street": "hui long guan","city": "beijing"}}

3)测试表 test

createtable test(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string, city:string>)row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/user/hive/warehouse/test';

4)导入文本数据到测试表

load data local inpath '/opt/module/hive/datas/test.txt' into table test;

hdfs上的文件被load后会被删除

5)访问三种集合列里的数据,以下分别是 ARRAY,MAP,STRUCT 的访问方式

select friends[1],children['xiao song'],address.city from test where name="songsong";
OK
_c0 _c1 city
lili 18 beijing
Time taken: 0.076 seconds, Fetched: 1 row(s)

7.类型转化

  • 可以进行隐式转换,但是不能进行反向转化 (1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成INT,INT 可以转换成 BIGINT。 (2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成DOUBLE。 (3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。 (4)BOOLEAN 类型不可以转换为任何其它的类型。
  • 可以使用 CAST 操作显示进行数据类型转换 例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。

8.DDL

  • 数据库相关
--增CREATEDATABASE[IFNOTEXISTS] database_name
[COMMENT database_comment][LOCATION hdfs_path]--指定存放位置[WITH DBPROPERTIES (property_name=property_value,...)];--删dropdatabaseifexists db_hive2;dropdatabase db_hive cascade;--如果数据库不为空,可以采用 cascade 命令,强制删除--改alterdatabase db_hive set dbproperties('createtime'='20170830');--查descdatabaseextended db_hive;--extended 查看详细信息
  • 表相关
--增CREATE[TEMPORARY][EXTERNAL]TABLE[IFNOTEXISTS] table_name  --EXTERNAL外部表[(col_name data_type [COMMENT col_comment],...)][COMMENT table_comment][PARTITIONED BY(col_name data_type [COMMENT col_comment],...)]--分区[CLUSTEREDBY(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][liketable]

ROW FORMAT指定SerDe,序列化和反序列化
语法一:
ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char] --列分隔符
[COLLECTION ITEMS TERMINATED BY char] --map、struct和array中每个元素之间的分隔符
[MAP KEYS TERMINATED BY char] --map中key与value的分隔符
[LINES TERMINATED BY char] --行分隔符
[NULL DEFINED AS char]
语法二:
ROW FORMAT SERDE serde_name [WITH SERDEPROPERTIES (propertyname=property_value,…)]

STORED AS 指定存储文件类型,常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本,默认值=)、ORC、PARQUET。
AS:后跟查询语句,根据查询结果创建表,会复制数据,不允许创建外部表
LIKE 允许用户复制现有的表结构,但是不复制数据,允许创建外部表

--查showcreatetable table_name;desc[formatted|extended] table_name;--删(如果是删除外部表,hdfs 中的数据还在,但是 metadata 中 dept 的元数据已被删除)droptable table_name;truncatetable table_name;--修改内部表 student2 为外部表altertable student2 set tblproperties('EXTERNAL'='TRUE');--更新列ALTERTABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment][FIRST|AFTER column_name]--增加和替换列(ADD 是代表新增一字段,字段位置在所有列后面(partition 列前),REPLACE 则是表示替换表中所有字段。)ALTERTABLE table_name ADD|REPLACECOLUMNS(col_name data_type [COMMENT col_comment],...)

alter 后HDFS数据文件并不会更改,需要重新load文件数据才能使用。
在alter时会自动校验数据类型能否转换,比如string转为int会报错,可以设置set hive.metastore.disallow.incompatible.col.type.changes=false;关闭校验

9.DML

  • 数据导入
--向表中装载数据loaddata[local] inpath '数据的 path'[overwrite]intotable student [partition(partcol1=val1,…)];--insert(overwrite覆盖 into追加)不支持插入部分字段insert overwrite/intotable student_par select id, name from student wheremonth='201709';--查询语句中创建表并加载数据createtableifnotexists student3 asselect id, name from student;--创建表时通过 Location 指定加载数据路径create external tableifnotexists student5( id int, name string)row format delimited fieldsterminatedby'\t'
location '/student';-- Import 数据到指定 Hive 表中importtable student2 from'/user/hive/warehouse/export/student';
  • 数据导出
--将查询的结果导出insert overwrite local directory '/opt/module/hive/data/export/student1'--local表示导出至本地,如无,表示导出到hdfsROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t'--格式化,可省略select*from student;-- Hadoop 命令导出到本地
dfs -get /user/hive/warehouse/student/student.txt/opt/module/data/export/student3.txt;--Hive Shell 命令导出(hive -f/-e 执行语句或者脚本 > file)
bin/hive -e 'select * from default.student;'>/opt/module/hive/data/export/student4.txt;--Export 导出到 HDFS 上(export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移)
export tabledefault.student to'/user/hive/warehouse/export/student';--清除(Truncate 只能删除管理表,不能删除外部表中数据)truncatetable table_name
  • 查询 1 )A<=>B :如果 A 和 B 都为 NULL,则返回 TRUE,如果一边为 NULL,返回 False; 2)比较运算符中(<>,<,>,between and),有一方为NULL,结果就返回NULL; 3)A RLIKE B, A REGEXP B:B 是基于 java 的正则表达式; 4)hive中连接方式有FULL JOIN,将会返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用 NULL 值替代。 5)优化:当对 3 个或者更多表进行 join 连接时,如果每个 on 子句都使用相同的连接键的话,那么只会产生一个 MapReduce job。 6)order by全局排序,只有一个 Reducer 7)sort by对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用先distribute by分区,再sort by排序。如 select * from emp distribute by deptno sort by empno desc; 8)cluster by当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式,但是排序只能是升序。 9)group by having和sql相同

10.分区

建表:

createtable dept_partition(
deptno int, dname string, loc string
)
partitioned by(day string)row format delimited fieldsterminatedby'\t';

注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。

加载数据

load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table dept_partition partition(day='20200401');

分区表加载数据时,必须指定分区

创建分区

altertable dept_partition addpartition(day='20200404');altertable dept_partition addpartition(day='20200405')partition(day='20200406');

删除分区(注意逗号

altertable dept_partition droppartition(day='20200406');altertable dept_partition droppartition(day='20200404'),partition(day='20200405');

查看分区

show partitions dept_partition;

创建二级分区表

createtable dept_partition2(
deptno int, dname string, loc string)
partitioned by(day string,hour string)row format delimited fieldsterminatedby'\t';

11.数据上传到分区表的方式

方法一:上传后同步
1)上传文件

hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;
hive (default)> dfs -put /opt/module/datas/dept_20200401.log 
/user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;

此时查询不到刚上传的数据
2)执行修复命令

hive> msck repair table dept_partition2;

此时可以查询到数据

方法二:上传数据后添加分区
1)上传文件
2)执行添加分区

hive (default)> alter table dept_partition2 add partition(day='201709',hour='14');

方法三:创建文件夹后 load 数据到分区
1)创建目录

hive (default)> dfs -mkdir -p /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=15;

2)上传数据

hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table dept_partition2 partition(day='20200401',hour='15');

12.严格模式和非严格模式

参数设置

--开启非严格模式
hive.exec.dynamic.partition.mode=nonstrict
--开启严格模式
hive.exec.dynamic.partition.mode=strict
  • 如果Hive开启严格模式,将会阻止以下三种查询: 1)对分区表查询,where条件中过滤字段没有分区字段; 2)对order by查询,order by的查询不带limit语句。 3)笛卡尔积join查询,join查询语句中不带on条件或者where条件;
  • 如果Hive开启严格模式,表示必须指定至少一个分区为 静态分区
--建表createtable dept_partition_dy(id int, name string) partitioned by(loc int,dt timestamp)row format delimited fieldsterminatedby'\t';--非严格模式set hive.exec.dynamic.partition.mode=nonstrict;
hive (default)>insertintotable dept_partition_dy partition(loc)select deptno, dname, loc, dt from dept;--严格模式set hive.exec.dynamic.partition.mode=strict;
hive (default)>INSERT OVERWRITE TABLE dept_partition_dy PARTITION(dt='2024-11-19', loc)SELECT deptno, dname, loc from dept;--在这里,loc分区将由SELECT子句(即loc)的最后一列动态创建。--而dt分区是手动指定写死的。

13.动态分区

动态分区是指向分区表insert时,被写入的分区不由用户指定,而是由每行数据的最后一个字段的值来动态决定。
开启动态分区参数设置

--开启动态分区功能(默认 true,开启)
hive.exec.dynamic.partition=true--设置为非严格模式
hive.exec.dynamic.partition.mode=nonstrict
--在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
hive.exec.max.dynamic.partitions=1000--在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就需要设置成大于 365,如果使用默认值 100,则会报错。
hive.exec.max.dynamic.partitions.pernode=100--整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000
hive.exec.max.created.files=100000--当有空分区生成时,是否抛出异常。一般不需要设置。默认 false
hive.error.on.empty.partition=false

14.分桶

对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
分区针对的是数据的存储路径;分桶针对的是数据文件。
建表

createtable stu_buck(id int, name string)clusteredby(id)into4 buckets
row format delimited fieldsterminatedby'\t';

分桶规则:
Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
分桶表操作需要注意的事项:
(1)reduce 的个数设置为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个
数设置为大于等于分桶表的桶数
(2)从 hdfs 中 load 数据到分桶表中,避免本地文件找不到问题
(3)不要使用本地模式

15.抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive 可以通过对表进行抽样来满足这个需求。
语法:

TABLESAMPLE(BUCKET x OUT OF y)

查询表 stu_buck 中的数据。

hive (default)>select*from stu_buck tablesample(bucket 1outof4on id);

注意:x 的值必须小于等于 y 的值,否则

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

16.常用函数

1)查看系统自带的函数

hive> show functions;

2)显示自带的函数的用法

hive> desc function upper;

3)详细显示自带的函数的用法

hive> desc function extended upper;

4)空字段赋值,如果 value 为 NULL,则 NVL 函数返回default_value 的值,否则返回 value 的值,如果两个参数都为 NULL ,则返回 NULL。

NVL( value,default_value)

5)

CASE WHEN THEN ELSE END

6)字符串拼接:

CONCAT(string A/col, string B/col…)

17.行转列

  • CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数为分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。str为null会被跳过; 注意: CONCAT_WS must be "string or array
  • COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 Array 类型字段

举例

在这里插入图片描述
需求
把星座和血型一样的人归类到一起。结果如下:
在这里插入图片描述
sql

SELECT
t1.c_b,
CONCAT_WS("|",collect_set(t1.name))FROM(SELECT
NAME,
CONCAT_WS(',',constellation,blood_type) c_b
FROM person_info
)t1
GROUPBY t1.c_b

18. 列转行

  • EXPLODE(col):将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行。
  • LATERAL VIEW 用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias 解释:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合

举例
在这里插入图片描述
需求
在这里插入图片描述

SELECT
movie,
category_name
FROM
movie_info
lateral VIEW
explode(split(category,",")) movie_info_tmp AS category_name;

19.窗口函数

1)OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
2)CURRENT ROW:当前行
3)n PRECEDING:往前 n 行数据
4)n FOLLOWING:往后 n 行数据
5)UNBOUNDED:起点,
UNBOUNDED PRECEDING 表示从前面的起点,
UNBOUNDED FOLLOWING 表示到后面的终点
6)LAG(col,n,default_val):往前第 n 行数据
7)LEAD(col,n, default_val):往后第 n 行数据
8)NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。注意:n 必须为 int 类型。
9)RANK() 排序相同时会重复,总数不会变
10)DENSE_RANK() 排序相同时会重复,总数会减少
11)ROW_NUMBER() 会根据顺序计算
在这里插入图片描述

--(1)查询在 2017 年 4 月份购买过的顾客及总人数select name,count(*)over()from business where substring(orderdate,1,7)='2017-04'groupby name;--(2)查询顾客的购买明细及月购买总额select name,orderdate,sum(cost)over(partitionby substring(1,7),name)from business;--(3)上述的场景, 将每个顾客的 cost 按照日期进行累加select name,orderdate,sum(cost)over(partitionby substring(1,7),name orderby orderdate)from business;--(4)查询每个顾客上次的购买时间select name,orderdate,lag(orderdate,1,'1900-01-01')over(partitionby name orderby orderdate)from business;--(5)查询前 20%时间的订单信息select*from(select*,row number()over(orderby orderdate) rn from business)where rn<=3;

20.自定义函数UDF

分类:
1)UDF 一进一出
2)UDAF 聚集函数,多进一出(类似于count,max)
3)UDTF 一进多出(如lateral view explode())

步骤:
1)导入依赖

<dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version></dependency></dependencies>

2)创建函数类
3)打成 jar 包上传到服务器/opt/module/data/myudf.jar
4)将 jar 包添加到 hive 的 classpath

hive (default)>add jar /opt/module/data/myudf.jar;

5)创建临时函数与开发好的 java class 关联

hive (default)>createtemporaryfunction my_len as"com.atguigu.hive.MyStringLength";

6)即可在 hql 中使用自定义的函数

hive (default)>select ename,my_len(ename) ename_len from emp;

21.列式存储和行式存储

在这里插入图片描述
如图所示左边为逻辑表,右边第一个为行式存储,第二个为列式存储。
1)行存储的特点
查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
2)列存储的特点
因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

21.hive文件格式

Hive 支持的存储数据的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。
TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
ORC 和 PARQUET 是基于列式存储的。

  • ORC在这里插入图片描述 每个stripe一般为HDFS的块大小,128M,但是默认为64M,可以修改为128M。每一个 stripe 包含多条记录,这些记录按照列进行独立存储,对应到 Parquet中的 row group 的概念。每个 Stripe 里有三部分组成,分别是 Index Data,Row Data,Stripe Footer: Index Data:一个轻量级的 index,默认是每隔 1W 行做一个索引。这里做的索引应该只是记录某行的各字段在 Row Data 中的 offset。 Row Data:存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个 Stream 来存储。 Stripe Footer:存的是各个 Stream 的类型,长度等信息。 每个文件有一个 File Footer,这里面存的是每个 Stripe 的行数,每个 Column 的数据类型信息等;每个文件的尾部是一个 PostScript,这里面记录了整个文件的压缩类型以及FileFooter 的长度信息等。在读取文件时,会 seek 到文件尾部读 PostScript,从里面解析到File Footer 长度,再读 FileFooter,从里面解析到各个 Stripe 信息,再读各个 Stripe,即从后 往前读。

1)建表

createtable log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
stored as orc
tblproperties("orc.compress"="NONE");-- 设置 orc 存储不使用压缩

2)desc formatted log_orc;
在这里插入图片描述
SerDe:以ORC格式序列化和反序列化
InputFormat:以ORC格式输入
OutputFormat:以ORC格式输出

3)向表中加载数据

hive (default)>insertintotable log_orc select*from log_text;

不能通过load data的方式加载数据,无法解析
4)查看表中数据大小

hive (default)> dfs -du -h /user/hive/warehouse/log_orc/;

5)ORC文件格式支持的参数如下:
参数默认值说明orc.compressZLIB压缩格式,可选项:NONE、ZLIB,、SNAPPYorc.compress.size262,144每个压缩块的大小(ORC文件是分块压缩的)orc.stripe.size67,108,864每个stripe的大小orc.row.index.stride10,000索引步长(每隔多少行数据建一条索引)

  • Parquet

是Hadoop生态中的一个通用的文件格式。以二进制方式存储,因此Parquet格式文件是自解析的。
在这里插入图片描述
(1)行组(Row Group):每一个行组包含一定的行数,在一个 HDFS 文件中至少存储一个行组,类似于 orc 的 stripe 的概念。
(2)列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。
(3)页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。
通常情况下,在存储 Parquet 数据的时候会按照 Block 大小设置行组的大小,由于一般情况下每一个 Mapper 任务处理数据的最小单位是一个 Block,这样可以把每一个行组由一个 Mapper 任务处理,增大任务执行并行度。

1)建表

createtable parquet_table
(column_speces)
stored as parquet
tblproperties (property_name=property_value,...);

2)加载数据方式与 orc相同。
3)支持的参数如下:
参数默认值说明parquet.compressionuncompressed压缩格式,可选项:uncompressed,snappy,gzip,lzo,brotli,lz4parquet.block.size134217728行组大小,通常与HDFS块大小保持一致parquet.page.size1048576页大小

22.压缩

在Hive表中和计算过程中,保持数据的压缩,会提高磁盘空间的有效利用和查询性能。
为了支持多种压缩/解压缩算法,Hadoop 引入了编码/解码器,如下表所示:
压缩格式对应的编码/解码器DEFLATEorg.apache.hadoop.io.compress.DefaultCodecgziporg.apache.hadoop.io.compress.GzipCodecbzip2org.apache.hadoop.io.compress.BZip2CodecLZOcom.hadoop.compression.lzo.LzopCodecSnappyorg.apache.hadoop.io.compress.SnappyCodec
bzip2和LZO可切片,DEFLATE,Gzip,Snappy不可切片

压缩速度:Snappy>LZO>Gzip>bzip2
解压速度:Snappy>LZO>Gzip>bzip2

22.1 建表时进行压缩

不同表类型的声明压缩方式是不同的。

  • TextFile

多数情况下,无需在建表语句做出声明。直接将压缩后的文件导入到该表即可,Hive在查询表中数据时,可自动识别其压缩格式,进行解压。需要注意的是,在执行往表中导入数据的SQL语句时,用户需设置以下参数,来保证写入表中的数据是被压缩的。

--SQL语句的最终输出结果是否压缩set hive.exec.compress.output=true;--输出结果的压缩格式(以下示例为snappy)set mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodec;

2)ORC

createtable orc_table
(column_specs)
stored as orc
tblproperties ("orc.compress"="snappy");

3)Parquet

createtable orc_table
(column_specs)
stored as parquet
tblproperties ("parquet.compression"="snappy");

22.2 计算过程中压缩

1)单个MR的中间结果进行压缩
单个MR的中间结果是指Mapper输出的数据,对其进行压缩可降低shuffle阶段的网络IO,可通过以下参数进行配置:

--开启MapReduce中间数据压缩功能set mapreduce.map.output.compress=true;--设置MapReduce中间数据数据的压缩方式(以下示例为snappy)set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2)单条SQL语句的中间结果进行压缩
单条SQL语句的中间结果是指,两个MR(一条SQL语句可能需要通过MR进行计算)之间的临时数据,可通过以下参数进行配置:

--是否对两个MR之间的临时数据进行压缩set hive.exec.compress.intermediate=true;--压缩格式(以下示例为snappy)set hive.intermediate.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;
标签: 大数据 hive hadoop

本文转载自: https://blog.csdn.net/weixin_43287333/article/details/143853427
版权归原作者 羊咩咩爱学习 所有, 如有侵权,请联系我们删除。

“大数据之Hive基础”的评论:

还没有评论