Apache Hive基础知识

Posted 终回首

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Hive基础知识相关的知识,希望对你有一定的参考价值。

我的hive学习笔记

一、简介

Apache Hive是一个提供访问HDFS上存储数据的SQL接口的数据仓库。适合存储数据不会频繁变化,且不需要快速响应给出结果的场景。Hive2.1.0暂不支持记录级别的更新、删除。

二、架构

在这里插入图片描述

JobTracker负责分配任务和资源管理
TaskTracker负责具体执行
Driver负责SQL编译、优化、执行
MetaStore存储元数据

1 Hive语句的执行过程

  1. 客户端接收到客户端的SQL
  2. 调用Driver,
    1. 从MetaStore读取元数据
    2. 转换成操作符
    3. 调用Hadoop或其他执行引擎执行
  3. client返回查询结果

2 元数据的三种模式

	1 单用户模式(不建议使用此模式)
		此模式连接到一个In-memory的数据库Derby,同一时间只允许一个用户连接
	2 多用户模式(推荐使用此模式)
		通过网络连接远程数据库,允许多个用户连接
	3 远程服务模式
		多了一层封装,可以提供用户通过Thrift协议调用服务来访问元数据

三、客户端命令行工具

Hive Cli

Hive Cli是一个客户端命令行界面,是和Hive交互的最常用的方式,使用Cli,用户可以建表、导入数据、查询等等。

注意:Hive1.0.0 后 Hive Cli不推荐使用,推荐的是Beeline Cli

案例:·

# 切换到hdfs用户
su hdfs
# 启动Hive Cli
hive
# 查看所有数据库
show Databases;
# 使用default数据库
use default;
# 查看所有的表
show tables;

Hive Cli 官方参考文档:
https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-RunningHiveCLI

Beeline Cli

Hive 1.0.0后推荐使用Beeline Cli

案例:

# 切换到hdfs用户
su hdfs
# 启动beeline
beeline 
# 连接指定ip,port和用户名密码的HiveServer2
!connect jdbc:hive2://localhost:10000 username passward
# 查看所有数据库
show databases;
# 使用default;
use default;
# 查看所有表
show tables;

Beeline 官方参考文档:
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-Beeline%E2%80%93NewCommandLineShell

四、数据类型

基本数据类型

类型描述示例
tinyint1个字节有符号整数1
smallint2个字节有符号整数2
int4个字节有符号整数3
bigint8个字节有符号整数4
flout4个字节单精度浮点数1.0
double8个字节双精度浮点数1.0
boolean布尔值true
string字符串,无长度限制“hello”

复合数据类型

类型描述示例
ARRAY有序列表,字段类型必须相同array(1,2,3)
MAP无序key-value映射,key的类型必须为基本类型,value可以是任意类型。同一个MAP中key的类型必须相同,value的类型也必须相同map(“a”:1,“b”:2,“c”:3)
struct可以包含不同数据类型的元素,多个字段为一组struct(“zhangsan”,23,3000)

数据类型 官方参考文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Overview

五、语法

这里只详细记录常用的,冷门操作可以看官方文档

1 DDL

数据库定义语言

DDL 官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Overview

  • CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
  • DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
  • TRUNCATE TABLE
  • ALTER DATABASE/SCHEMA, TABLE, VIEW
  • MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
  • SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

1.1 Create/Drop/Alter/Use Database

数据库的创建、删除、修改、使用操作

1.1.1 Create Database

创建数据库

语法:

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [MANAGEDLOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];
  • DATABASE和SCHEMA是一个意思,类似mysql里的Database
  • COMMENT 备注,添加备注后,查看库的时信息可以看到
  • LOCATION 默认库的路径,创建内部表后,内部表的默认父路径
  • MANAGEDLOCATION 默认的管理库的路径,创建外部表后,外部表的默认父路径
  • DBPROPERTIES 自定义设置一些属性,比如可以指定username=zhangsan,create_time=2021-12-12 12:12:12

示例:

create database if not exists test_db_1 
comment "test database"  
with dbproperties (create_user=zhangsan);

1.1.2 Use Database

使用数据库

语法:

USE database_name;

示例:

use test_db_1 ;

1.1.3 Drop Database

删除数据库

语法:

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
  • CASCADE 假如数据库里有表,默认删除时会提示无法删除,此时加上CASCADE 即可强制删除(慎用)

案例:

# 强制删除数据库,即使有表存在也会一起删除
drop database if exists test_db_1 cascade;

1.2 Create/Drop/Truncate Table

表的创建、删除、截断操作

1.2.1 Create Table

语法:

-- 语法1-直接建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
  [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]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

-- 语法2-使用现有表建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

关键词解释

  • TEMPORARY 建表时添加这个关键字建好的表是临时表,当前会话退出后表就会被删除,用的较少
  • EXTERNAL 建表时指定external的表是外部表,什么是外部表下面有介绍
  • IF NOT EXISTS 如果表不存在则创建,存在则正常退出
  • db_name. 指定要创建的表位于哪个数据库
  • table_name 指定表名
  • col_name data_type COMMENT col_comment 字段名和字段对应的类型,COMMENT的意思是申明字段的备注,备注内容为col_comment;可以有多个
  • COMMENT table_comment 申明表的备注,备注内容为table_comment
  • PARTITIONED BY (col_name data_type [COMMENT col_comment], …) 指定根据哪些字段分区,col_name data_type COMMENT col_comment 指定分区字段名和字段类型、备注和备注内容;可以有多个
  • CLUSTERED BY (col_name, col_name, …) [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS
    CLUSTERED BY申明分桶,根据类型为字段名为col_name等一个或多个字段分桶,SORTED BY根据列名为col_name的字段进行排序,asc是顺序,desc是倒序,INTO num_buckets BUCKETS指定分几个桶,桶的数量是num_buckets
  • SKEWED BY (col_name, col_name, …) 指定数据倾斜列,可以提高有数据倾斜列时的查询性能
  • ON ((col_value, col_value, …) 指定具体的倾斜列的倾斜的值
  • STORED AS DIRECTORIES 指定使用列表桶,为倾斜的字段的值创建子目录,查询时提高性能
  • ROW FORMAT row_format 指定字段、array、map、行按照什么规则切分,切分规则如下
    row_format
    : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
    [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
    [NULL DEFINED AS char] – (Note: Available in Hive 0.13 and later)
    | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
  • STORED AS file_format 指定文件格式,支持TEXTFILE(默认)、SEQUENCEFILE、RCFILE、ORC、PARQUET、AVRO、JSONFILE(Hive4.0.0后支持的类型,其他类型都是1.0.0版本之前就支持的类型)
  • LOCATION hdfs_path 指定表在HDFS上的存储路径
  • TBLPROPERTIES (property_name=property_value, …) 指定表的自定义属性,既可以修改预先定义好的属性也可以自定义添加新属性,这里类似数据库的自定义属性
  • AS select_statement 以查询结果作为表结构

Hive表有四种,内部表,外部表,分区表,分桶表

  • 内部表是不指定external和temporary时默认的建表方式,这种方式创建的表被删除时,数据也会被一起删除,表定义和数据强关联
  • 外部表是指定external的表,这种方式创建的表被删除时,数据不会被一起删除,表定义和数据弱关联
  • 分区表就是有分区的表,分区就是把数据安装某个或多个字段分别存在不同的目录下。在查询时可以根据分区筛选数据,减少读取的数据量
  • 分桶表

案例:

-- 内部表
create table if not exists default.test_tb_1(
	user_id int "user's id",
	user_name string "user's name"
);
-- 外部表
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     country STRING COMMENT 'country of origination')
 COMMENT 'This is the staging page view table'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\054'
 STORED AS TEXTFILE
 LOCATION '<hdfs_location>';
-- 分区表
create external table if not exists default.test_tb_2(
	user_id int "user's id",
	user_name string "user's name"
)partitioned by (create_date string,org_num int);
-- 分桶表
CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\\001'
   COLLECTION ITEMS TERMINATED BY '\\002'
   MAP KEYS TERMINATED BY '\\003'
 STORED AS SEQUENCEFILE;

1.2.2 Drop Table

删除表

语法:

DROP TABLE [IF EXISTS] table_name [PURGE]; 

关键字解释

  • PURGE 跳过回收站,在不指定purge的默认情况下,数据会进入HDFS的.Trash/Current路径下同时表定义会被完全删除,误删后可以通过次项找回。但指定purge后,数据将被跳过回收站直接删除(慎用)

案例:

drop table if exists default.test_tb_1;

1.2.3 Truncate Table

清空表,只能清空内部表或内部表分区的数据
语法:

TRUNCATE TABLE table_name [PARTITION partition_spec];

关键字解释:

  • table_name 要清空的表名
  • PARTITION partition_spec 要清空具体分区

案例:

truncate table default.test_tb_1;

1.2.3 Alter Table/Partition/Column

修改表、分区、列
内容较多,常用的不多,建议直接查看官方文档

此部分内容的官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable

2 DML

数据处理语言

2.1 将数据导入表

注意

  • 多个分区字段是有先后顺序的;
  • 动态插入分区表时需要开启动态分区(set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;);
  • 导入分区表或动态插入分区表时,分区字段必须按顺序排到所有非分区字段后

2.1.1 Loading files into tables

将文件导入到表

语法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

关键词意思

  • LOCAL 指定文件存放在本地文件系统,不指定LOCAL默认为HDFS文件系统;从本地导入时是复制,导入表后原有数据仍旧存在;从HDFS导入时,是移动,导入后原路径数据会消失;
  • filepath 文件的路径
  • OVERWRITE 指定清空表再导入新数据,默认为append(追加)
  • tablename 要导入的表
  • PARTITION (partcol1=val1, partcol2=val2 …) 如果上面的表是分区表,那么需要指定要导入的分区;有多个分区需要指定多个分区

案例:

# 导入本地的数据到非分区表,追加导入
LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' INTO TABLE test_1;
# 导入本地的数据到分区表的指定分区,追加导入
LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' INTO TABLE test_1 PARTITIO(pt='20200101');

# 导入HDFS的数据到非分区表,覆盖原有数据
LOAD DATA INPATH '/home/admin/test/test.txt' OVERWRITE  INTO TABLE test_2;
# 导入HDFS的数据到分区表的指定分区,覆盖原有数据
LOAD DATA INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1 PARTITIO(pt='20200101');

2.1.2 Inserting data into Hive Tables from queries

从查询插入数据到hive表

语法:

# 标准语法
	#覆盖原有数据
	INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
	# 追加插入
	INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

# 动态分区插入
INSERT OVERWRITE|INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

案例:

# 插入非分区表,覆盖原有数据
insert overwrite table tablename1 select a, b, c from test_1;
# 插入非分区表,覆盖原有数据
insert overwrite table tablename1 select a, b, c from test_1;
# 插入分区表,以追加的方式
insert into table tablename1 partition (create_date='20210101',org='1') select a, b, c from test_1;

# 一个静态分区,一个动态分区,插入分区表
insert overwrite table page_view partition (dt='2008-06-08', country) select pvs.user_id, pvs.user_name from page_view_stg pvs;
# 动态插入分区表,2个动态分区,不包括静态分区
insert overwrite table test_1(create_date, org) select user_id, user_name,create_date,org from tablename1;

动态分区需要注意调整的参数

参数名默认值意思
hive.exec.dynamic.partitiontrue设置为true,表示开启动态分区
hive.exec.dynamic.partition.modestrict当处于strict模式时,用户至少需要指定一个静态分区;在nonstrict 模式时,允许分区都是动态分区
hive.exec.max.dynamic.partitions.pernode100每个mapper/reducer被允许创建的动态分区数的最大值
hive.exec.max.dynamic.partitions1000允许创建的动态分区数的最大值
hive.exec.max.created.files100000hive任务的mapper/reducer创建的文件数的个数
hive.error.on.empty.partitionfalse动态分区插入产生空结果时是否抛出异常

2.1.3 Writing data into the filesystem from queries

将查询出的数据导出到文件系统

语法:

INSERT OVERWRITE [LOCAL] DIRECTORY directory1
  [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
  SELECT ... FROM ...

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)

案例:

# 将表数据导出到本地文件系统,分割符为逗号
insert OVERWRITE LOCAL DIRECTORY '/home/hadoop/local_test_output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from test_1;
# 将表数据导出到HDFS文件系统,分隔符为逗号
insert OVERWRITE DIRECTORY '/home/hadoop/hdfs_test_output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from test_1;

注意导出到文件系统时,启动用户要有输出目录的写权限。

DML 官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

3 DQL

数据查询语言

语法:

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [HAVING having_condition]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]

关键字解释:

  • WITH CommonTableExpression (, CommonTableExpression)*
    定义CTE(公共表表达式),定义好后,一个查询里可以多次引用定义好的公共表
  • SELECT [ALL | DISTINCT] select_expr, select_expr, …
    DISTINCT指定时,查询返回去重后的结果,不指定默认为ALL,返回所有数据
    select_expr 查询的列或者表达式,例如user_id,max(user_id)
  • FROM table_reference
    table_reference 表名
  • WHERE where_condition
    where_condition 筛选条件,对select到的列的值进行筛选,保留满足条件的
  • GROUP BY col_list
    col_list 分组依据的列
  • HAVING having_condition
    having_condition 分组后,组内数据的筛选条件,保留满足条件的
  • ORDER BY col_list
    col_list 根据指定的字段排序,全局排序;order by 是在一个reduce里执行,所以数据量大时,速度很慢,可以通过嵌套排序加快速度
  • CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list
    CLUSTER BY col_list 根据指定的列排序,全局排序,只能降序
    DISTRIBUTE BY col_list 根据指定的字段分区,同一个字段的同一个值落在一个分区里
    SORT BY col_list 每个reducer里排序,非全局排序
  • LIMIT [offset,] rows
    限制返回的条数,offset表示返回的数据从第几行开始,rows表示返回几行

案例:

# 定义公共表,查询公共表
with 
t1 as select * from test_1
select * from t1;

# 查询
select org,sum(age)
from t_user
where user_id > 1
group by org
having avg(age) > 35
order by org;

3.1 语句执行顺序

Hive SQL执行顺序

-- 正常SQL顺序
selectfromwheregroup byhavingorder bylimit-- 真正执行顺序
fromwhereselectgroup byhavingorder bylimit

我的理解:

  1. from 找到从哪个或哪几个表找数据
  2. where 根据where条件留下符合条件的数据,这个是过滤不需要的行
  3. select 留下要查询的字段,这个是过滤不需要的列
  4. group by 根据哪些字段分组
  5. having 组内过滤
  6. order by 排序
  7. 限制返回行数

3.2 操作符和用户自定义函数

此部分内容较多,且官方文档就很容易理解,直接看官方文档即可

官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

六、元数据

元数据详解:
https://www.cnblogs.com/qingyunzong/p/8710356.html

元数据统计信息收集思路:
https://blog.csdn.net/songjifei/article/details/104706737

元数据详细信息收集思路:
https://blog.csdn.net/sanbudeyu_008/article/details/102800508

七、Hive优化

1 设置合理的map/reduce 数量

1.1 调整map数量

目的就是让单个map处理合适数据量的数据。

1.1.1 数据量小,减少map数

当有几百个小文件时,可以通过调整参数合并文件,减少文件数

设置如下参数:

# 设置map任务的文件切割大小为100MB
set mapred.max.split.size=100000000;
# 设置每个节点的文件切割大小为100MB
set mapred.min.split.size.per.node=100000000;
# 设置每个机架的文件切割大小为100MB
set mapred.min.split.size.per.rack=100000000;
# 设置执行map前先合并文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,
小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并。

1.1.2 数据量大,增加map数

当文件很大,只用1个map去处理很费时间,此时可以增加map数量(按自己集群情况调整)。

设置如下参数:

set mapred.map.tasks=10;

1.2 调整reduce数量

如果设置了mapred.reduce.tasks/mapreduce.job.reduces参数,那么Hive会直接使用它的值作为Reduce的个数;如果mapred.reduce.tasks/mapreduce.job.reduces的值没有设置(也就是-1),那么Hive会根据输入文件的大小估算出Reduce的个数。根据输入文件估算Reduce的个数可能未必很准确,因为Reduce的输入是Map的输出,而Map的输出可能会比输入要小,所以最准确的数根据Map的输出估算Reduce的个数。

reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:

hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)

计算reducer数的公式 N=min(参数2,总输入数据量/参数1)
如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;

1.2.1 方法1

调整如下参数

# 设置每个reduce处理的文件大小设置为500MB
set hive.exec.reducers.bytes.per.reducer=500000000;

1.2.2 方法2

调整如下参数

# 设置reduce的数量为15
set mapred.reduce.tasks=15;

2 小文件优化

小文件产生可能的原因:

1 动态分区插入数据,产生大量的小文件,从而导致map数量剧增;
2 reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
3 数据源本身就包含大量的小文件

小文件的影响:

  1. 从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。
  2. 在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展。

源头解决思路:

1 减少reduce的数量(可以使用参数进行控制);
2 少用动态分区,用时记得按distribute by分区;

已有小文件解决思路:

1 使用hadoop archive命令把小文件进行归档;
2 重建表,建表时减少reduce数量;
3 通过参数进行调节,设置map/reduce端的相关参数

可调整的map/reduce参数:

# 每个Map最大输入大小(这个值决定了合并后文件的数量)  
set mapred.max.split.size=100000000;
# 一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node=100000000; 
# 一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)    
set mapred.min.split.size.per.rack=100000000;  
# 执行Map前进行小文件合并  
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

# 设置map端输出进行合并,默认为true  
set hive.merge.mapfiles = true  
# 设置reduce端输出进行合并,默认为false  
set hive.merge.mapredfiles = true  
# 设置合并文件的大小  
set hive.merge.size.per.task = 256*1000*1000  
# 当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。  
set hive.merge.smallfiles.avgsize=16000000 

3 SQL优化

优化思路:

  1. 尽早尽量过滤数据,减少每个阶段的数据量
  2. 减少job数
  3. 减少扫描的文件数或分区数

案例表

# t_order 订单表
create table t_order(
	order_id int "订单编号",
	user_id int "用户编号",
	create_date string "订单创建时间"
);

以上是关于Apache Hive基础知识的主要内容,如果未能解决你的问题,请参考以下文章

执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。无法验证 serde:org.apache.hadoop.hive.serde2.avro.A

Hive 错误:失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。字符串类型信息

hadoop离线day08--数据仓库Apache Hive

hadoop离线day08--数据仓库Apache Hive

Apache Hive 基本理论与安装指南

当查询具有 GROUP BY 子句时,Hive 查询抛出“来自 org.apache.hadoop.hive.ql.exec.tez.TezTask 的代码 2”异常