Hive入门
什么是Hive
Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
Hive的本质是一个Hadoop客户端,用于将HQL(Hive SQL)转化成MapReduce程序。
-
Hive中每张表的数据存储在HDFS
-
Hive的底层计算引擎是MapReduce(也可配置为Spark或者Tez)
-
执行程序运行在Yarn上
Hive中的表在Hadoop中是目录;Hive中的数据在Hadoop中是文件。
Hive架构
Hive安装部署
下载
http://archive.apache.org/dist/hive/
这里我们使用3.1.3版本
安装
-
把 apache-hive-3.1.3-bin.tar.gz 上传到Linux的 /opt/software 目录下
-
解压 apache-hive-3.1.3-bin.tar.gz 到 /opt/module/ 目录下面
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/
-
修改 apache-hive-3.1.3-bin.tar.gz 的名称为 hive
mv /opt/module/apache-hive-3.1.3-bin /opt/module/hive
-
修改 /etc/profile.d/my_env.sh ,添加环境变量
vim /etc/profile.d/my_env.sh
#HIVE_HOME export HIVE_HOME=/opt/module/hive export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile.d/my_env.sh
配置Hive元数据存储到MySQL
进入MySQL新建Hive元数据库
create database metastore;
将MySQL的JDBC驱动拷贝到Hive的lib目录下
cp mysql-connector-java-5.1.37.jar /opt/module/hive/lib
在 /opt/module/hive/conf 目录下新建 hive-site.xml 文件并添加如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc连接的URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc连接的Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc连接的username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc连接的password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- Hive默认在HDFS的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
初始化Hive元数据库
bin/schematool -dbType mysql -initSchema -verbose
Hive服务部署
HiveServer2服务
Hive的hiveserver2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能。
部署
hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要将hiveserver2的启动用户设置为Hadoop的代理用户,配置方式如下:
修改Hadoop的配置文件 core-site.xml ,增加如下配置,然后将配置分发到整个集群
<!--配置所有节点的kaze用户都可作为代理用户-->
<property>
<name>hadoop.proxyuser.kaze.hosts</name>
<value>*</value>
</property>
<!--配置kaze用户能够代理的用户组为任意组-->
<property>
<name>hadoop.proxyuser.kaze.groups</name>
<value>*</value>
</property>
<!--配置kaze用户能够代理的用户为任意用户-->
<property>
<name>hadoop.proxyuser.kaze.users</name>
<value>*</value>
</property>
在 hive-site.xml 文件中添加如下配置信息
<!-- 指定hiveserver2连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<!-- 指定hiveserver2连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
启动hiveserver2
nohup bin/hive --service hiveserver2 &
使用命令行客户端beeline进行远程访问
bin/beeline -u jdbc:hive2://hadoop102:10000 -n kaze
MetaStore服务
Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。
部署
确保 metastore 服务的配置文件 hive-site.xml 中包含连接元数据库所需的以下参数
<!-- jdbc连接的URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc连接的Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc连接的username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc连接的password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
确保 Hiveserver2 和每个 Hive CLI 的配置文件 hive-site.xml 中包含访问 metastore 服务所需的以下参数
<!-- 指定metastore服务的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
启动metastore
nohup bin/hive --service metastore &
Hive服务启动脚本
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
Hive常用命令
-e:不进入hive的交互窗口执行hql语句
bin/hive -e "select id from student;"
-f:执行sql文件中的hql语句
bin/hive -f /opt/module/hive/datas/hivef.sql > /opt/module/hive/datas/hive_result.txt
DDL
数据库
创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
查询数据库
展示所有数据库
SHOW DATABASES [LIKE ''];
查看数据库信息
DESCRIBE DATABASE [EXTENDED] db_name;
修改数据库
-- 修改dbproperties
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);
-- 修改location
ALTER DATABASE database_name SET LOCATION hdfs_path;
-- 修改owner user
ALTER DATABASE database_name SET OWNER USER user_name;
删除数据库
DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];
RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。
CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。
切换数据库
USE database_name;
表
创建表
普通建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]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, ...)]
TEMPORARY
临时表,该表只在当前会话可见,会话结束,表会被删除。
EXTERNAL
外部表,与之相对应的是内部表(管理表)。管理表意味着Hive会完全接管该表,包括元数据和HDFS中的数据。而外部表则意味着Hive只接管元数据,而不完全接管HDFS中的数据。
data_type
Hive中的字段类型可分为基本数据类型和复杂数据类型
基本数据类型
Hive | 说明 | 定义 |
---|---|---|
tinyint | 1byte有符号整数 | |
smallint | 2byte有符号整数 | |
int | 4byte有符号整数 | |
bigint | 8byte有符号整数 | |
boolean | 布尔类型,true或者false | |
float | 单精度浮点数 | |
double | 双精度浮点数 | |
decimal | 十进制精准数字类型 | decimal(16,2) |
varchar | 字符序列,需指定最大长度,最大长度的范围是[1,65535] | varchar(32) |
string | 字符串,无需指定最大长度 | |
timestamp | 时间类型 | |
binary | 二进制数据 |
复杂数据类型
类型 | 说明 | 定义 | 取值 |
---|---|---|---|
array | 数组是一组相同类型的值的集合 | array | arr[0] |
map | map是一组相同类型的键-值对集合 | map<string, int> | map['key'] |
struct | 结构体由多个属性组成,每个属性都有自己的属性名和数据类型 | struct<id:int, name:string> | struct.id |
类型转换
-
隐式转换
-
string类型可以隐式地转换成double
-
boolean类型不可以转换为任何其它的类型
除此之外和Java中的隐式转换规则差不多
-
-
显式转换
cast(expr as <type>)
PARTITIONED BY
创建分区表
CLUSTERED BY ... SORTED BY...INTO ... BUCKETS
创建分桶表
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]
ROW FORMAT SERDE serde_name
[WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, ...)]
STORED AS
指定文件格式,常用的文件格式有,textfile(默认值),sequence file,orc file、parquet file等等。
LOCATION
指定表所对应的HDFS路径,若不指定路径,其默认值为${hive.metastore.warehouse.dir}/db_name.db/table_name
TBLPROPERTIES
用于配置表的一些KV键值对参数
Create Table As Select
该语法允许用户利用select查询语句返回的结果直接建表
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 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, ...)]
查看表
展示所有表
SHOW TABLES [IN database_name] LIKE ['identifier_with_wildcards'];
查看表信息
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name
修改表
重命名表
ALTER TABLE table_name RENAME TO new_table_name
修改列信息
-- 增加列
ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...);
-- 更新列
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name];
-- 替换列
ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...);
删除表
DROP TABLE [IF EXISTS] table_name;
清空表
TRUNCATE [TABLE] table_name;
DML
Load
Load语句可将文件导入到Hive表中。
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)];
Insert
将查询结果插入表中
INSERT (INTO | OVERWRITE) TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement;
将给定Values插入表中
INSERT (INTO | OVERWRITE) TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
将查询结果写入目标路径
INSERT OVERWRITE [LOCAL] DIRECTORY directory
[ROW FORMAT row_format] [STORED AS file_format] select_statement;
Export&Import
Export导出语句可将表的数据和元数据信息一并导出到指定的HDFS路径,Import可将Export导出的内容导入Hive,表的数据和元数据信息都会恢复。Export和Import可用于两个Hive实例之间的数据迁移。
--导出
EXPORT TABLE tablename TO 'export_target_path'
--导入
IMPORT [EXTERNAL] TABLE new_or_original_tablename FROM 'source_path' [LOCATION 'import_target_path']
查询
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference -- 从什么表查
[WHERE where_condition] -- 过滤
[GROUP BY col_list] -- 分组查询
[HAVING col_list] -- 分组后过滤
[ORDER BY col_list] -- 排序
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number] -- 限制输出的行数
每个Reduce内部排序(Sort By)
对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用Sort by。
分区(Distribute By)
在有些情况下,我们需要控制某个特定行应该到哪个Reduce,distribute by 子句可以做这件事,一般会结合sort by使用。
distribute by的分区规则是根据分区字段的hash值与reduce的个数进行相除后,余数相同的分到一个区。
Hive要求distribute by语句要写在sort by语句之前。
分区排序(Cluster By)
当distribute by和sort by字段相同时,可以使用cluster by来代替。
此时排序是升序排序,不能指定排序规则
函数
Hive提供了大量的内置函数,按照其特点可大致分为如下几类:单行函数、聚合函数、炸裂函数、窗口函数。
查看系统内置函数
show functions;
查看内置函数详细信息
desc function extended function_name;
单行函数
单行函数的特点是一进一出,即输入一行,输出一行。
单行函数按照功能可分为如下几类: 日期函数、字符串函数、集合函数、数学函数、流程控制函数等。
数值函数
round:四舍五入
ceil:向上取整
floor:向下取整
字符串函数
substring:截取字符串
replace:替换
regexp_replace:正则替换
regexp:正则匹配
repeat:重复字符串
split:字符串切割
nvl:替换null值
concat:拼接字符串
concat_ws:以指定分隔符拼接字符串或者字符串数组
get_json_object:解析json字符串
日期函数
unix_timestamp:返回当前或指定时间的时间戳
to_utc_timestamp:返回指定时区的时间戳
from_unixtime:转化UNIX时间戳到指定的时间格式
from_utc_timestamp:转化UNIX时间戳到指定时区的标准时间格式
current_date:当前日期
current_timestamp:当前的日期加时间,包含毫秒
month、day、hour:获取标准时间字符串中的月、日、时
datediff:两个日期相差的天数
date_add:日期加天数
date_sub:日期减天数
date_format:将标准日期解析成指定格式字符串
流程控制函数
case when:条件判断函数
case
when a then b
[when c then d]
[else e]
end
case a
when b then c
[when d then e]
[else f]
end
if:条件判断
if(boolean testCondition, T valueTrue, T valueFalseOrNull)
集合函数
size:集合中元素的个数
map:创建map集合
map_keys: 返回map中的key
map_values: 返回map中的value
array:创建array集合
array_contains:判断array中是否包含某个元素
sort_array:将array中的元素排序
named_struct:声明struct的属性和值
高级聚合函数
多进一出 (多行传入,一个行输出)。
collect_list收集并形成list集合,结果不去重
collect_set收集并形成set集合,结果去重
炸裂函数
UDTF(Table-Generating Functions),接收一行数据,输出一行或多行数据。
explode
posexplode
inline
Lateral View通常与UDTF配合使用。Lateral View可以将UDTF应用到源表的每行数据,将每行数
据转换为一行或多行,并将源表中每行的输出结果与该行连接起来,形成一个虚拟表。
select cate, count(*) cnt
from movie_info lateral view explode(split(category, ',')) tmp as cate
group by cate;
窗口函数
窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行数据。
窗口函数的语法中主要包括“窗口”和“函数”两部分。其中“窗口”用于定义计算范围,“函数”用于定义计算逻辑。
基本语法
函数() over (窗口范围)
函数
按照功能,常用窗口函数可划分为如下几类:聚合函数、跨行取值函数、排名函数。
聚合函数:max、min、sum、avg、count
跨行取值函数:
lag、lead
功能:获取当前行的上/下边某行、某个字段的值。
语法:lag(字段名,偏移量, 默认值)
lag和lead函数不支持自定义窗口。
first_value、last_value
功能:获取窗口内某一列的第一个值/最后一个值
语法:first_value(字段名,是否跳过null)
排名函数:rank 、dense_rank、row_number
rank 、dense_rank、row_number不支持自定义窗口。
窗口
窗口范围的定义分为两种类型,一种是基于行的,一种是基于值的。
基于行
如果没有用order by进行排序,那么窗口范围内的行是随机的,不确定的。
此时[num]的单位是行
unbounded preceding代表第一行
unbounded following代表最后一行
基于值
基于值的窗口划分方式,是基于order by字段的值划分的,所以order by不能省略
此时[num]的单位是整形数值1
unbounded preceding代表负无穷
unbounded following代表正无穷
分区
定义窗口范围时,可以指定分区字段,每个分区单独划分窗口。
缺省
over() 中的三部分内容partition by、order by、(rows|range) between … and … 均可省略不写。
partition by省略不写,表示不分区
order by 省略不写,表示不排序,但一般不省略
(rows|range) between … and … 省略不写,则使用其默认值,默认值如下:
-
若over()中包含order by,则默认值为
range between unbounded preceding and current row
-
若over()中不包含order by,则默认值为
rows between unbounded preceding and unbounded following
自定义UDF函数
需求:自定义一个UDF实现计算给定基本数据类型的长度
创建Maven工程,导入依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.3</version>
</dependency>
创建类
public class MyUDF extends GenericUDF {
/**
* 判断传进来的参数的类型和长度
* 约定返回的数据类型
*/
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
if (arguments.length != 1) {
throw new UDFArgumentLengthException("please give me only one arg");
}
if (!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
throw new UDFArgumentTypeException(1, "i need primitive type arg");
}
return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
}
/**
* 解决具体逻辑的
*/
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
Object o = arguments[0].get();
if(o==null){
return 0;
}
return o.toString().length();
}
@Override
// 用于获取解释的字符串
public String getDisplayString(String[] children) {
return "";
}
}
创建永久函数
将项目打成jar包并上传到HDFS上
create function my_len
as "com.atguigu.hive.udf.MyUDF"
using jar "hdfs://hadoop102:8020/udf/myudf.jar";
永久函数创建的时候,在函数名之前需要加上库名,如果不指定库名的话,会默认把当前库的库名给加上。
永久函数使用的时候,需要在指定的库里面操作,或者在其他库里面使用的话需要在函数名前加上库名。
分区表和分桶表
分区表
Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样查询效率会提高很多。
分区表基本语法
创建分区表
create table dept_partition
(
deptno int, --部门编号
dname string, --部门名称
loc string --部门位置
)
partitioned by (day string)
row format delimited fields terminated by '\t';
向分区表写数据
load data local inpath '/opt/module/hive/datas/dept_20220401.log'
into table dept_partition
partition(day='20220401');
insert overwrite table dept_partition partition (day = '20220402')
select deptno, dname, loc
from dept_partition
where day = '2020-04-01';
从分区表读数据
查询分区表数据时,可以将分区字段看作表的伪列,可像使用其他字段一样使用分区字段。
select deptno, dname, loc ,day
from dept_partition
where day = '2020-04-01';
查看所有分区信息
show partitions dept_partition;
增加分区
alter table dept_partition
add partition(day='20220403');
删除分区
alter table dept_partition
drop partition (day='20220403');
修复分区
msck repair table table_name sync partitions
二级分区表
create table dept_partition2(
deptno int, -- 部门编号
dname string, -- 部门名称
loc string -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
动态分区
动态分区是指向分区表insert数据时,写入的分区不由用户指定,而是由每行数据的最后一个字段的值来动态的决定。
动态分区的模式,默认strict(严格模式),要求必须指定至少一个分区字段为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。
set hive.exec.dynamic.partition.mode=nonstrict
插入数据时进行动态分区
insert into table dept_partition_dynamic partition(loc)
select deptno, dname, loc from dept;
分桶表
对于一张表或者分区,Hive 可以进一步组织成桶。分区针对的是数据的存储路径,分桶针对的是数据文件。
分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。
创建分桶表
create table stu_buck(
id int,
name string
)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
创建分桶排序表
create table stu_buck_sort(
id int,
name string
)
clustered by(id) sorted by(id)
into 4 buckets
row format delimited fields terminated by '\t';
分桶排序表中每个桶内的数据都是经过排序的
文件格式和压缩
因为Hive是Hadoop的客户端,所以Hadoop支持的压缩格式Hive都支持
Hive文件格式
为Hive表中的数据选择一个合适的文件格式可以提高查询性能。
Hive表数据的存储格式有:
-
行式存储:text file、sequence file
-
列式存储:orc、parquet
Text File
文本文件是Hive默认使用的文件格式,文本文件中的一行内容,就对应Hive表中的一行记录。
ORC
Parquet
压缩
Hive表数据进行压缩
TextFile
-- SQL语句的最终输出结果是否压缩
set hive.exec.compress.output=true;
-- 输出结果的压缩格式(以下示例为snappy)
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
ORC
create table orc_table
(column_specs)
stored as orc
tblproperties ("orc.compress"="snappy");
Parquet
create table parquet_table
(column_specs)
stored as parquet
tblproperties ("parquet.compression"="snappy");
计算过程中使用压缩
单个MR的中间结果进行压缩
-- 开启MapReduce中间数据压缩功能
set mapreduce.map.output.compress=true;
-- 设置MapReduce中间数据数据的压缩方式(以下示例为snappy)
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
单条SQL语句的中间结果进行压缩
-- 是否对两个MR之间的临时数据进行压缩
set hive.exec.compress.intermediate=true;
-- 压缩格式(以下示例为snappy)
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;