Kaze
Kaze
Published on 2023-11-22 / 53 Visits
1
3

Hive

Hive入门

什么是Hive

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

Hive的本质是一个Hadoop客户端,用于将HQL(Hive SQL)转化成MapReduce程序。

  1. Hive中每张表的数据存储在HDFS

  2. Hive的底层计算引擎是MapReduce(也可配置为Spark或者Tez)

  3. 执行程序运行在Yarn上

Hive中的表在Hadoop中是目录;Hive中的数据在Hadoop中是文件。

Hive架构

image-20231121145814037

Hive安装部署

下载

http://archive.apache.org/dist/hive/

这里我们使用3.1.3版本

安装

  1. 把 apache-hive-3.1.3-bin.tar.gz 上传到Linux的 /opt/software 目录下

  2. 解压 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/
    
  3. 修改 apache-hive-3.1.3-bin.tar.gz 的名称为 hive

    mv /opt/module/apache-hive-3.1.3-bin /opt/module/hive
    
  4. 修改 /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说明定义
tinyint1byte有符号整数
smallint2byte有符号整数
int4byte有符号整数
bigint8byte有符号整数
boolean布尔类型,true或者false
float单精度浮点数
double双精度浮点数
decimal十进制精准数字类型decimal(16,2)
varchar字符序列,需指定最大长度,最大长度的范围是[1,65535]varchar(32)
string字符串,无需指定最大长度
timestamp时间类型
binary二进制数据

复杂数据类型

类型说明定义取值
array数组是一组相同类型的值的集合arrayarr[0]
mapmap是一组相同类型的键-值对集合map<string, int>map['key']
struct结构体由多个属性组成,每个属性都有自己的属性名和数据类型struct<id:int, name:string>struct.id

类型转换

  • 隐式转换

    1. string类型可以隐式地转换成double

    2. 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常用函数大全

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进行排序,那么窗口范围内的行是随机的,不确定的。

image-20231122101219850

此时[num]的单位是行

unbounded preceding代表第一行

unbounded following代表最后一行

基于值

基于值的窗口划分方式,是基于order by字段的值划分的,所以order by不能省略

image-20231122101716815

此时[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

image-20231122145259683

Parquet

image-20231122145444217

压缩

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;

Comment