Hive的总结

一, 基本了解

1.Hive的简介

-1. 由Facebook开源用于解决海量结构化日志的数据统计,后称为Apache Hive为一个开源项目。

-2. Hive是基于Hadoop的一个数据仓库工具,可以将结构化数据文件映射成一张表,并提供类似SQL的查询功能。一个数据可以建立多个数据库,每一个数据库都是一个数 据源。

-3. Hive的本质是将HQL转化成MapReduce程序。

-4. Hive处理的数据存储在HDFS,分析数据底层实现的是MapReduce,执行程序运行在Yarn上。

 

2.Hive的体系结构

 

-1. 用户接口(Client):CLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)

-2. 元数据(Metastore):表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等; 默认存储在自带的derby数据库中,推荐使用采用MySQL

-3. Hadoop:使用HDFS进行存储,使用MapReduce进行计算;

-4. 驱动器:(Driver):包含:解析器、编译器、优化器、执行器;

解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是否有出现);

编译器:将AST编译生成逻辑执行计划;

优化器:对逻辑执行计划进行优化;

执行器:把逻辑执行计划转换成可以运行的物理计划。

对于Hive来说就是MR/TEZ/Spark;

 

3.Hive 优点与使用场景

-1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手);

-2. 避免了去写MapReduce,减少开发人员的学习成本;

-3. 统一的元数据管理,可与impala/spark等共享元数据;

-4. 易扩展(HDFS+MapReduce:可以扩展集群规模;支持自定义函数);

-5. 数据的离线处理;比如:日志分析,海量结构化数据离线分析…

-6. Hive的执行延迟比较高,因此hive常用于数据分析的,对实时性要求不高的场合;

-7. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

 

4. Hive的安装和配置的一些注意点

-1. 安装之前的准备(JDK,hadoop,Linux,mysql)

a. Java 1.7 

注意:  Hive 1.2版本   需要Java 1.7或更新版本。2.0版本的Hive版本与Java 1.6一起使用。强烈建议用户开始转向Java 1.8(参见  HIVE-8607)。  

b. Hadoop 2.x(首选),1.x(Hive 2.0.0之后不支持)。

Hive版本高达0.13还支持Hadoop 0.20.x,0.23.x.

c. Linux系统(推荐)

Hive常用于生产Linux和Windows环境。Mac是一个常用的开发环境。本文档中的说明适用于Linux和Mac。在Windows上使用它将需要稍微不同的步骤。  

d. 关系型数据库(预装mysql)

hive的元数据保存在关系型数据库中,默认元数据保存在自带的derby数据库,只能一个人登录访问

-2. Hive官网和文档,以及下载地址的URL

官网:http://hive.apache.org

安装文档:https://cwiki.apache.org/confluence/display/Hive/Home

下载地址:http://archive.apache.org/dist/hive/

hiveserver2 metastore 区别

注意:单机的时候不要配置metastore服务,不然每次启动beeline都需要先开启metastore服务。

 


 

二,hive的操作命令(Hive命令最后都要加上;)

1.数据库的基本操作

-1. 默认数据库是default

-2. 创建数据库:create database test;

-3. 列表显示所有数据库:show databases;

-4. 查看指定数据库信息:desc database test;

查看指定数据库的详细信息:desc database extended test; [ 额外显示创建数据库时设置的属性 ]

 

-5. 切换库:use test;

-6. 删除空数据库:drop database test;

级联删除数据库(包括表):drop database test cascade; [ 删除之后数据库在hdfs上的目录也删除 ]

更完善格式:drop database if exists test cascade; [ 如果数据库不存在不会报错 ]

-7. 修改数据库信息

alter database database_name set dbproperties(property_name=property_value, ...); 

-8. 创建数据库完整格式

create database|schema 关键字,database和schema 都可以

[if not exists] database_name 判断是否存在,不存在创建

[comment database_comment] 数据库的注释

[location hdfs_path] 数据库在hdfs上的目录,默认/user/hive/warehouse/database_name

[with dbproperties (property_name=property_value, ...)]; 设置一些属性

 

2. 数据表的基本操作(hive操作表时最好在表名前都加上数据库名)

官网链接https://cwiki.apache.org//confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL

-1. 创建表(不指定databbase,默认表创建在default数据库)

hive> create table student(id int,name string) row format delimited fields terminated by ' ' ;

 

-2. 显示数据库所有表:show tables;

 

 

-3. 删除表和清空表

删除表(表结构和数据,即整个表):drop table student;

清空表数据(只删除表中的数据):truncate table student;

注意

1. truncate table student; 只能对管理表使用,不能对外部表使用

2. truncate 命令操作时表名前不能加上database_name

3. 外部表 drop 之后,数据表在hdfs上目录的数据文件依然存在,实际是只删除了保存在关系型数据库中的元数据

4. 管理表 truncate 之后,数据表location 所在目录的数据文件删除,目录依然存在。

管理表 drop 之后,数据表location 所在目录删除。删除了元数据和数据文件,数据目录。

外部表测试

 

管理表测试:

 

 

-4. 查看表信息

显示表基本信息:desc student;

 

查看表详细信息:desc extended student; [ 显示的内容基本一致 ]

 

格式化显示表详细信息:desc formatted student;

 

-5. 查询表(查询优化是在驱动器优化阶段做的工作,最好在表名前加上数据库名)

不调用MR程序:select * from test_hive.student;

调用MR程序:select name from test_hive.student;

 

-6. 在命令行修改表的一些信息或者属性(alter table语句 表名前不能加database)

a. 修改表名

alter table test rename to test_new;

b. 修改location

alter table test set location 'hdfs://nameservice1/data/test';

c. 修改表属性 —— 设置表的编码格式

alter table test3 set serdeproperties('serialization.encoding'='GBK');

 

-7. hive导入数据(实际上就是拷贝文件到表所在的目录)

a. 导入文本数据

load data [local] inpath '/student.txt'

[overwrite] into table test_hive.student

[partition(part1='value1',part2='value2',...)]

local:加上local是加载本地数据,实际上是把本地文件上传到到 hdfs,和调用fs -put命令一样。

不加local是加载hdfs上数据。剪切数据,将加载的数据文件剪切到表的location目录。

例:load data local inpath '/student.txt' into table test_hive.student;

load data inpath '/student.txt' into table test_hive.student;

overwrite:加上 overwrite 覆盖导入,覆盖现有表中的数据

不加上 overwrite追加导入,也称 append 导入 。追加新导入的数据到表中。

例:load data inpath '/student.txt' overwrite into table test_hive.student;

例:load data inpath '/student.txt' into table test_hive.student;

inpath加载的数据的目录,一般写全路径。可以指定到文件,也可以直接指定目录,指定目录会加载目录下所有文件的数据。

partition向分区表中导入数据。

b. 导入其他表的数据(追加导入和覆盖导入):底层执行mapreduce程序

insert into table test_hive.student_insert select * from student;

insert overwrite table test_hive.student_insert select * from student;

c. 创建表时通过select加载,直接导入数据(* 也可以换位某几个字段):底层执行mapreduce程序

create table student_select as select * from student;

其实类似于以下两句的组合:

create table student_select like student;

insert into table test_hive.student_select select * from student;

d. 创建表时指定location

注意:创建表指定location必须是不存在的目录,不然创建表会失败。可以先创建表,再删除相应的目录,再将数据上传到对应的目录。表就可以直接加载出数据。

 

-8. hive导出数据

1. insert overwrite [local] directory..命令导出数据

a. insert..local directory 导出hive表中数据到本地 【 可以指定导出文件的分隔符 】

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_insert_export'

row format delimited fields terminated by ' '

select * from test_hive.student;

b. insert..directory 导出hive表中数据到HDFS文件系统

insert overwrite directory "/hive_insert_export/bb" select * from test_hive.student;

c. 注意点

1. 导出数据到本地,指定的目录程序会覆盖同名目录或者文件,数据会丢失;导出数据到hdfs文件系统,指定的目录程序不会覆盖同名目录或者文件,会在目录下生成结果文件,原有文件保留。

2. 导出数据到本地,可以指定文件输出的分隔符,不指定默认分隔符为^A(即 01);

导出数据到hdfs, 不能指定文件分隔符,只能使用默认分隔符^A(即 01)。

3. 执行insert导出数据,底层运行mapreduce程序,运行结束在指定的目录下生成000000_0的结果文件。多个reduce任务,则依次类推000000_0/000001_0...可以通过设置参数指定reduce个数 。

set mapred.reduce.tasks=1; 或者 set mapreduce.job.reduces=1; 指定reduce任务个数为1

注意:如果程序没有shuffle过程,也就是没有reduce过程,程序map的输出就是最终的数据,指定reduce的任务个数并不能决定最终结果输出的文件数,最终结果依次是000000_0/000001_0......

3. hive -e 把查询结果导出到一个指定文件

bin/hive -e 'select * from test_hive.student' > /opt/cdh-5.3.6/data/hive_e_export/aa

注意:1. 写的目录可以是存在的文件,也可以是不存在的文件,但是不能写目录

2. > 覆盖写入,>>追加写入

3. 输出的结果和查询出的结果一样,cli命令行第一行输出字段名,beeline输出表格形式的

4. sqoop工具

把关系型数据库的数据导入到Hadoop与其相关的系统(HBase和Hive)中。

 

-9. 自带的Export和Import功能(后来出的新功能)

export底层没有执行mapreduce程序,实际上就是数据的备份,拷贝的包括有元数据。

指定的目录必须是空的或者不存在的。

export table test_hive.student to '/hive_export_import';

 

import指定的目录结构要和export的目录结构一样

import table test_hive.student_import from '/hive_export_import';

 

 

3. hive函数的相关操作

-1. 查看hive自带的所有函数

show functions;

-2. 查看某个函数的用法

desc function upper;

-3. 查看某个函数的详细用法(加上使用案例)

desc function extended upper;

 

upper具体操作显示(upper:小写转成大写)

select id,upper(name) uname from test_hive.student;

 

-4. 常用函数

a concat函数(字符串链接):select concat(empno,'_',sal) from emp;

b. substr函数(字符串的截取):select substr(hiredate,1,4) as year from emp;

c. day函数(天):select day(hiredate) as day from emp;

d. cast函数(类型转换):select cast(1472704474123/1000 as int) from emp;

 

4. Hive与其他命令的交互操作(不要忘记最后的;)

-1 Hive与linux交互命令(前边加上 !)

 !ls;

!pwd;

 

-2. 与hdfs交互命令(只能用dfs,不支持fs)

  dfs -ls /;

dfs -mkdir /words.txt;

 

 

5. Hive历史命令查看

在当前用的 home 目录下,有一个 .hivehistory 的隐藏文件,保存了hive执行的所有历史命令

cat /home/beifeng/.hivehistory

 


 

三, 数据库创建表的详细操作

官方文档创建表链接:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable

1. 创建数据库表的完整格式

创建数据库表(temporary临时表,external外部表)

create [temporary] [external] table if not exists test.student(

ip string comment 'student ip', 列名和数据类型以及列的注释

name string

)

comment 'beifeng student logs’ 表的注释

partitioned by (date string,hour string) 创建分区表(也可以用comment注释)

clustered by (id) sorted by(name) into 4 buckets 创建桶表

(clustered by数据分成bucket,sorted by对bucket中的数据排序)

row format delimited fields terminated '/t' 行分割符

colection items terminated ‘/n’, 列分隔符(列分割符默认是'/n',一般不写)

stored as PARQUET 文件存储格式(默认textfile)

location ‘/opt/modules/mydata' 表在HDFS上的数据目录

[ create table test.aa ]as select * from student_ne 以子查询的结果创建表

 

2. 创建表的方式

-1. 直接创建表

creata table student(id int,name string)row format delimited fields terminated by ' ';

-2. 把另外一张表的某几个字段抽取出来创建成一张新表(创建的表包含数据)

create table test.student_as as select * from student;

create table test.student_name as select name from student;

-3. 复制表结构(创建的表不包含数据)

creata table student_new(

id int,

name string

)

like student

location '/user/hive/warehouse/student'

row format delimited fields terminated by ' ';

 

3. Hive数据表的类型

临时表[了解],管理表,外部表,分区表,桶表

3.1 创建临时表(关键字temporary) 了解

-1. 语法

create temporary table student_temp(

ip string comment 'student ip',

name string

)

-2. 临时表的使用以及注意点

a. Hive 0.14.0开始提供创建临时表的功能。临时表只对当前session有效,session退出表自动删除。

b. 如果创建的临时表表名已存在,那么当前session引用到该表名时实际用的是临时表,只有drop或rename临时表名才能使用原始表;

c. 临时表限制:不支持分区字段和创建索引。

-3. 临时表的存储类型配置

从Hive1.1开始临时表可以存储在内存或SSD,使用hive.exec.temporary.table.storage参数进行配置,该参数有三种取值:memory、ssd、default。

 

3.2 外部表和管理表(关键字:external)

-1. 语法

creata external table student_ext(

id int,

name string

)

row format delimited fields terminated by ' ';

-2. 管理表和外部表的异同

a. 外部表创建的时候多一个关键字external

b. 管理表删除:数据库表的数据和HDFS上的对应表文件同时删除;

外部表删除:只删除数据库表的数据,HDFS上的对应表文件不会删除。

c. 外部表的这种情况保证了数据的安全性,防止误操作删除数据。

d. 一般情况下管理表创建表时不指定location,外部表创建表时需要指定location。

e. 除了创建表的时候外部表多了一个关键字,其他操作语句和管理表完全一致。

 

3.3 分区表的相关操作(关键字:partitioned by)

-1. 创建分区表(注意partpartitioned和row的顺序)

天+小时(一般分区表和外部表一起使用)

create external table test_hive.log_partition(

id int,

name string

)

partitioned by (date string,hour string)

row format delimited fields terminated by ' ';

 

-2. 导入数据

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170802_16' into table log_partition partition(date='20170802',hour='16');

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170802_17' into table log_partition partition(date='20170802',hour='17');

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170803_16' into table log_partition partition(date='20170803',hour='16');

 

-3. 查看分区表数据(单独查看一个分区加上where条件即可)

select * from log_partition;

select * from log_partition where date='20170802' and hour='17';

查看目录结构:

dfs -ls /user/hive/warehouse/test_hive.db/log_partition;

dfs -ls /user/hive/warehouse/test_hive.db/log_partition/date=20170802;

 

-4. 查看分区表(主要是查看分区情况):show partitions log_partition ;

 

-5. 删除分区表(和drop table一样,外部分区表只是删除表中数据,不会删除hdfs上的数据)

alter table log_partition drop partition(date='20170803');

 

-6. 手动重建分区(分区中文件存在,表中没有数据)

非分区表,可以直接调用命令 fs -put 将数据上传到相应表的目录,表就可以加载出数据。

但是分区表 使用 fs -put 命令,将数据加载到分区对应的目录,表不能加载数据。

方式一:

分区重建:实际是根据表的目录结构在hive元数据的表PARTITIONS中重新写入分区记录

手动上传数据导入分区表测试:

dfs -mkdir -p /user/hive/warehouse/test_hive.db/log_partition/date=20170803/hour=18;

dfs -put /opt/cdh-5.3.6/data/hive_partition/log_20170803_18 /user/hive/warehouse/test_hive.db/log_partition/date=20170803/hour=18;

select * from log_partition; [ 查看是否有上传分区的数据(无数据,重建之后重新查询) ]

分区重建命令:msck repair table log_partition;

通过测试发现:分区重建之后,可以把我们的外部分区表刚才删除的分区的数据也加载出来。可以验证是根据hdfs上数据的目录结构重建的分区信息,也就是向表PARTITIONS中重写记录。因为刚才hdfs上数据并没有删除。

 

方式二:

添加分区:实际是根据添加的分区信息在hive元数据的表PARTITIONS中写入了一条记录。

alter table log_partition add partition(date='20170804',hour='18');

注意:几级分区,写几级目录。

如:alter table log_partition add partition(date='20170804'); 不能执行成功

完整测试:

dfs -mkdir -p /user/hive/warehouse/test_hive.db/log_partition/date=20170804/hour=18;

dfs -put /opt/cdh-5.3.6/data/hive_partition/log_20170804_18 /user/hive/warehouse/test_hive.db/log_partition/date=20170804/hour=18;

alter table log_partition add partition(date='20170804',hour='18');

 

-6. 分区表的应用场景

a. 由第三方提供的数据源或者数据源是日志文件;

b. 分区表一般采用外部表+分区表的格式;

c. 主要用于定时任务加载数据;

d. 主要用于同比或者环比分析数据。

注意:引用外部表数据是因为删除外部表保留数据; 防止误删除操作,删除所有数据;查询时尽量利用分区字段,如果不使用分区字段,就会全部扫描。

-7. 分区表优点:分期增量抽取数据,定时任务完成,主要在于优化查询。

 

3.4 创建桶表(关键字:clustered by,sorted by)

-1. 语法

creata table student_new(

id int,

name string

)

clustered by (id) sorted by(name) into 4 buckets

row format delimited fields terminated by ' ';

-2. 桶表的使用

a. Hive采用对列值哈希,然后除以桶的个数求余决定该条记录存放在哪个桶当中;

b. 采用桶能够带来一些好处,比如JOIN操作. 对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作. 那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量;

c. hive中table可以分成partition,clustered by可以将table和partition分成bucket,

d. sorted by将bucket中的数据排序. 提升某些查询操作效率,例如mapside join;

e. clustered by和sorted by不会影响数据的导入,用户必须自己负责数据如何导 入,包括数据的分桶和排序。'set hive.enforce.bucketing = true'  可以自动控制上一轮reduce的数量从而适配bucket的个数,用户也可以自己设置 mapred.reduce.tasks去适配bucket 个数。

-3. bucket主要作用

a. 数据sampling(抽样)

b. 提升某些查询操作效率,例如mapside join

c. buket的另一个功能是减少shuffle,根据查询中的关键词(过滤条件,group by条件,join 条件)来分桶,可以有效减少shuffle。

 

3.5 创建事物表

相关链接:http://blog.csdn.net/kinglin_zy/article/details/69219077

-1. 语法

CREATE TABLE table_name (

id int,

name string

)

CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC

TBLPROPERTIES ("transactional"="true",

"compactor.mapreduce.map.memory.mb"="2048",

"compactorthreshold.hive.compactor.delta.num.threshold"="4",

"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5" );

-2. Hive ACID事物表相关预设置:参阅Hive事务

a. 指定创建的表是ACID事物表。可选值:true/false,默认false。

TBLPROPERTIES(“transactional”=“true”);

b. 阻止事物表的所有自动压缩。可选值:true/false,默认值“false”

TBLPROPERTIES(“NO_AUTO_COMPACTION”=“true”)

仍然可以使用Alter Table语句进行手动压缩  。

例:alter table test [partition partition_condition] set serdeproperties(‘"orc.compress"="SNAPPY"');

c. 指定压缩映射作业属性

TBLPROPERTIES(“compactor.mapreduce.map.memory.mb”=“ 2048”)

d. 如果有超过4个delta目录,则触发较小的压缩

TBLPROPERTIES(“compactorthreshold.hive.compactor.delta.num.threshold”=“ 4”)

e. 如果delta文件的大小与基本文件的大小比例大于50%,就会触发主压缩

TBLPROPERTIES(“compactorthreshold.hive.compactor.delta.pct.threshold”=“ 0.5”)

-3. 事物表介绍

a. 在表中使用插入,更新,删除操作,需要定义事物表。从Hive 0.14.0开始,hive支持事物表的创建。

b. 表定义为事物表,不能转换回非事物表,即不能更改TBLPROPERTIES(“transactional”=“false”)

c. 建表语句必须带有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,并且不能带有sorted by子句。(只能使用orc,并且必须创建桶表)

d. 除了以上要求,使用分区表还需要添加许多配置。参阅Hive事务

d. 不能修改bucket列的值,否则会报错。

 


 

四, Hive中设置参数

1. 查看参数配置信息

查看当前所有参数配置信息:set; [ 显示hive的所有信息以及hadoop的环境信息等参数配置信息 ]

查看某个参数配置信息:set property_name; 例:set mapreduce.job.reduces;

 

2. 设置属性的几种方式

-1. 在hive-site.xml 文件中设置

-2. 在hive命令行中使用 set命令 设置(临时设置,在当前会话生效)

set property_name=property_value;

-3. with dbproperties 创建数据库的时候指定一些属性(必须加上with)

例:create database create_utf with dbproperties('serialization.encoding'='UTF-8');

-4. dbproperties 创建表的时候指定一些属性

例:create table test2(name string) stored as orc tblproperties('serialization.encoding'='UTF-8');

-5. -hiveconf 在进入hive命令行的时候设置参数

bin/hive -hiveconf hive.root.logger=INFO,console [ 设置hive的日志显示在前台 ]

-6. alter table 命令修改表属性(可以修改dbproperties 预设置的属性)

alter table test3 set serdeproperties(‘property_name=property_value');

例:alter table test3 set serdeproperties('serialization.encoding'='GBK');

 

3. 预定义表属性可设置的属性(TBLPROPERTIES指定表属性)

参阅官方文档TBLPROPERTIES

-1. 表的注释

TBLPROPERTIES(“comment”=“ table_comment ”)

-2. 创建Hive和Hbase集成表时,指定hbase表名。参阅:HBase集成

TBLPROPERTIES(“hbase.table.name”=“ table_name ”)

-3. 创建不可变表。可选值:true/false,默认false,

TBLPROPERTIES(“immutable”=“true”);Hive 0.13.0开始,可以创建不可变表。不可变表数据不为空时,INSERT INTO操作将被禁止,INSERT OVERWRITE操作不受限制。但如果不可变表为空,则INSERT INTO仍然可以操作。不可变表可以防止意外更新,多次插入的误操作。

-4. 在指定表的文件格式的时候可以指定压缩格式。可选值:ZLIB,SNAPPY,NONE。

TBLPROPERTIES(“orc.compress”=“ZLIB”)

例:create table test(name string,id string) stored as orc tblproperties("orc.compress"="SNAPPY");

-5. Hive ACID事物表相关预设置:参阅Hive事务

-6. 指定PURGE,删除表或者清除表的时候数据不会放到回收箱,会直接删除。

TBLPROPERTIES(“auto.purge”=“true”)可选值:true/false,默认值“false”

在删除表或者清除表数据的时指定PURGE:DROP TABLE [IF EXISTS] table_name [PURGE];

在Hive 0.7.0或更高版本中,如果表或者分区表分区不存在,DROP报错,除非指定IF EXISTS或配置变量 hive.exec.drop.ignorenonexistent 设置为true。指定PURGE后,可以避免这种错误。

-7. 将管理表更改为外部表,反之亦然。可选值:true/false。

TBLPROPERTIES(“EXTERNAL”=“TRUE”)

-8. 仅在Parquet表上设置的属性,用于存储用于调整时间戳值的Java时区ID。

TBLPROPERTIES(“parquet.mr.int96.write.zone”=“ timeZoneId ”)

 

4. 在hive-site.xml配置hive cli命令行(即,bin/hive)一些便利的设置

-1. cli命令行显示当前所在的数据库名称(效果:hive (t2)>)

<property>

<name>hive.cli.print.header</name>

<value>true</value>

<description>Whether to print the names of the columns in query output.</description>

</property>

-2. cli命令行查询数据时显示列名

<property>

<name>hive.cli.print.current.db</name>

<value>true</value>

<description>Whether to include the current database in the Hive prompt.</description>

</property>

 

 

5. 在hive-site.xml配置hive中数据在hdfs上的保存路径

hive中数据默认保存路径(default数据库中的表直接在warehouse文件夹下创建数据表目录)

default数据库:/user/hive/warehouse/table_name

自定义数据库:/user/hive/warehouse/database_name/table_name

hive中数据默认保存路径在hive-site.xml中的设置,可以自行配置,修改数据保存路径

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

 

 


 

五, bin/hive命令行解析(可以指定执行文件,指定参数等)

bin/hive -help 显示hive命令行所有可以追加的参数

 

1. -hiveconf指定参数运行命令行

例:bin/hive --hiveconf hive.root.logger=INFO,console [ 设置hive的日志显示在前台 ]

2. -database指定数据库进入cli命令行

bin/hive -database test_hive

3. -e不进入hive命令行测试sql语句使用

可以将执行结果追加/覆盖保存文件中,执行结果包含列名

例:bin/hive -e "select * from test_hive.student" > /opt/cdh-5.3.6/data/test_hive/student_e_out

 

4. -f 指定命令行执行保存sql语句的文件

可以将执行结果追加/覆盖保存文件中,执行结果包含列名

例 : bin/hive -f /opt/cdh-5.3.6/data/test_hive/student.sql > /opt/cdh-5.3.6/data/test_hive/student_out

 

5. -i:与用户自定义 udf 时交互使用

 


 

六, 数据类型(表中属性的类型)

1. 常用的数据类型

| TINYINT

| SMALLINT

| INT

| BIGINT

| BOOLEAN

| FLOAT

| DOUBLE

| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)

| STRING

| BINARY -- (Note: Available in Hive 0.8.0 and later)

| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)

| DECIMAL -- (Note: Available in Hive 0.11.0 and later)

| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)

| DATE -- (Note: Available in Hive 0.12.0 and later)

| VARCHAR -- (Note: Available in Hive 0.12.0 and later)

| CHAR -- (Note: Available in Hive 0.13.0 and later)

2. 复杂数据类型

| array_type

| map_type

| struct_type

| union_type -- (Note: Available in Hive 0.7.0 and later)

 

 

 

 


 

七, Hive几种排序的方式

参考资料http://blog.csdn.net/jthink_/article/details/38903775

1. order by

a. 全局数据的排序;

b. 只要hive的sql中指定了order by所有的数据都会到同一个reducer进行处理,需谨慎使用;

即便是参数指定reduce的数量,程序还是会运行在1个reduce。

c. 如果开启了严格模式hive.mapred.mode=strict(默认值是nonstrict),就必须指定 limit来限制输出条数,因为所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果。

2. sort by

a. 一个reducer端的排序,保证局部有序,不能保证全局有序。

b. 一个reducer可以保证全局有序,可以设置参数:set mapreduce.job.reduces=1

c. sort by好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率。

3. distribute by

a. 类似MapReduce中的分区partition,是控制map的输出在reducer是如何划分的;

b. hive会根据distribute by后面列,根据reduce的个数进行数据分发,默认是采用hash算法;

c. 一般distribute by和sort by一起使用,但是distribute by必须要写在sort by之前,先分区再排序。

4. cluster by

a. cluster by的功能就是distribute by和sort by相结合,同时进行分区和排序;

b. 当distribute by和sort by字段相同时,可以使用cluster by;

b. 注意被cluster by指定的列默认只能是升序,不能指定asc(升序)和desc(降序)。

 

所有测试:

原表中的数据文件,所有数据显示:测试基本采用对name字段进行分区或者排序

 

 

1. 测试 order by

设置1个reduce任务测试:

set mapreduce.job.reduces=1;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_order_reduce1'

select * from test_hive.student_by_test sort by name;

设置3个reduce任务测试:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_order_reduce3'

select * from test_hive.student_by_test order by name;

设置3个reduce任务结果显示:

 

结果分析:设置reduce任务不为1,order by的执行reduce任务也是1个,执行结果只有1个文件。

 

2. 测试 sort by

设置1个reduce任务测试:

set mapreduce.job.reduces=1;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_sort_reduce1'

select * from test_hive.student_by_test sort by name;

设置3个reduce任务测试:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_sort_reduce3'

select * from test_hive.student_by_test sort by name;

设置3个reduce任务结果显示:

 

结果分析:设置reduce任务为1时,sort by可以保证输出结果的顺序。

设置reduce任务不为1时,sort by只能保证每个reduce输出结果有序。

 

3. 测试 distribute by

设置3个reduce任务,单独distribute by测试:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_distribute_reduce3'

select * from test_hive.student_by_test distribute by id;

 

设置3个reduce任务,distribute by和sort by结合使用测试:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_distribute_reduce3_sort'

select * from test_hive.student_by_test distribute by id sort by name;

 

结果分析:首先指定 distribute by,发现表中的26条数据均匀分割给每个reduce,当指定sort by和distribute by结合使用的时候,可以保证单个reduce的数据有序。

 

4. 测试 cluster by

设置3个reduce任务测试:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_cluster_reduce3_id'

select * from test_hive.student_by_test cluster by id;

 

 


 

八, Hive自定义函数之UDF函数

1. UDF几种类型

a. UDF(User-Defined-Function):一进一出

b. UDAF(User-Defined Aggregation Funcation):聚集函数,多进一出;

类似于:count/max/min

c. UDTF(User-Defined Table-Generating Functions):一进多出;

如lateral  view  explore()

2. 配置好maven环境,创建maven项目,在pom.xml文件中添加hadoop和hive的依赖

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-client</artifactId>

<version>2.5.0-cdh5.3.6</version>

</dependency>

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-jdbc</artifactId>

<version>0.13.1-cdh5.3.6</version>

</dependency>

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-exec</artifactId>

<version>0.13.1-cdh5.3.6</version>

</dependency>

 

3. 编写UDF函数

a. 自定义UDF需继成UDF类 【 源码包:org.apache.hadoop.hive.ql.exec.UDF 】

b. 需要实现至少一个evaluate函数,可以实现多个,evaluate函数支持重载参数不限制。

c. UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

d. UDF中最好Text/LongWritable等hadoop的字节码数据类型,不推荐使用java类型;

自己实现的大写转小写的UDF函数LowerUDF代码

 

UDF类源码:

 

4. 自定义函数的使用步骤

-1. 把程序打包放到目标机器上去。[普通的JAR file打包,和mapreduce程序打包的方式一样]

-2. 进入hive客户端,添加jar包到hive的class path中。[指定的是jar包本地目录,要写到jar文件]

例如:add jar /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/ownerUDF/hive_owner_UDF_lower.jar;

-3. 创建函数:加上temporary,代表临时函数,只在当前窗口有效,退出当前hive窗口就失效。

create function my_lower as "hive.UDF.LowerUDF";

create temporary function my_lower_temp as "hive.UDF.LowerUDF";

-4. 查看自己的function

show function;

-5. HQL语句查询验证

select name,my_lower(name) lower_name from student_udf;

select name,my_lower_temp(name) lower_name from student_udf;

-6. 删除函数:临时函数和永久函数的drop方法要对应使用,不然会报错,不能删除成功。

drop function my_lower ;

drop temporary function my_lower_temp;

 

5. 创建UDF函数的新方法(简单方式 hive 0.13之后才有的)

-1. 创建函数

create function self_lower as 'hive.UDF.LowerUDF' using jar 'hdfs://bigdata-cdh.ibeifeng.com:8020/hive_UDF/owner_lower.jar';

create temporary function self_lower_temp as 'hive.UDF.LowerUDF' using jar 'hdfs://bigdata-cdh.ibeifeng.com:8020/hive_UDF/owner_lower.jar';

-2. HQL语句查询验证

select name,self_lower(name) lower_name from student_udf;

select name,dzl_lower(name) lower_name from student_udf;

-3. 注意点:

a. 这种方法创建UDF函数,也是可以创建临时和非临时函数。对应的删除方法一样。

b. 这种方法创建UDF函数,使用show function不能显示出函数,但是可以正常使用。

c. 执行语句中的目录必须是hdfs上的目录,主机名,端口号不能漏写,文件要写到jar文件。

6. UDF函数日常应用中注意事项

-1. 一般我们不会把UDF函数设置为永久生效

-2. 日常应用时,函数都是跟着业务(job)走的,用到相应函数时我们才会去添加这个函数。

 


 

九, hive提供的服务组件了解 —— metastore 服务以及hiveserver2服务

1. 查看hive提供的service:bin/hive -service help

 

2. 启动hive service:bin/hive --service 服务组件名

例:bin/hive -service hiveserver2

3. 具体服务的帮助信息:bin/hive --service metastore --help

 

 

4. hive metastore 服务

hive三种配置方式链接http://blog.csdn.net/reesun/article/details/8556078

-1. 默认情况下,metastore和Hive服务运行在同一个进程里。使用这个服务,可以让metastore作为一个单独的(远程)进程运行,使本机的hive成为一个服务端,远程主机可以连接本机的hive。

-2. 当hive作为客户端和服务端分开使用时,客户端和服务端元数据的配置不同,服务端配置元数据保存的数据库的四要素,客户端配置metastore的相关配置(metastore服务的主机名和端口)。

-3. hive metastore在hive-site.xml文件中的配置(详细参考伪分布式的配置,两个配置参数)

-4. hive metastore的启动:bin/hive --service metastore

后台启动:nohup bin/hive --service metastore

注意:单机时,或者在本机(服务端hive)运行使用hive时,不需要启动metastore服务。如果启动了,不要再关闭metastore服务,关闭之后,使用 Thrift 服务(即,beeline命令行,JDBC连接hive)将无法连接hive元数据,,需要重新启动。

 

5. hiveserver2 服务(远程主机使用本机的hive服务,需要先开启metastore服务)

hiveserver2 服务连接https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,可以让Hive以提供Trift服务的服务器形式来运行,提供新的Thrift API为开放API,可以允许许多不同语言编写的客户端进行通信,如:JDBC等。它还解决了HiveServer不能处理多于一个客户端的并发请求,支持多客户端的并发和认证。可以使用全新的beeline命令行远程并发访问hive服务端的hive服务。

-1. beeline 命令行的使用

beeline命令行相比较bin/hive命令行,查询结果显示的更好看一点,且查询产生的日志是打印在开启hiveserver2服务的服务端窗口,不在客户端的beeline命令行打印。

1). 启动hiveserver2(两种启动方式)

bin/hiveserver2

bin/hive --service hiveserver2

指定端口启动:bin/hive --service hiveserver2 -p 10000 【 默认10000 】

2). beeline的方式连接

启动 beeline:bin/beeline

连接:!connect jdbc:hive2://bigdata-cdh.ibeifeng.com:10000 beifeng beifeng org.apache.hive.jdbc.HiveDriver

3). jdbc 的交互方式连接beeline命令行(不同的进入beeline命令行的方法)

bin/beeline -u jdbc:hive2://bigdata-cdh.ibeifeng.com:10000/default beifeng beifeng

4). 退出beeline命令行 !q 或者 !quit

-2. JDBC连接hive

在我们处理数据量比较小的结果集的时候,可以使用JDBC连接的方式和前段交互,提高查询效率。

1). 启动hiveserver2

2). 代码实现(代码的实现和关系型数据库一样)

 

 

6. 其他服务

-1. cli这个就是Command Line Interface的简写,是Hive的命令行界面,用的比较多。这是默认的服务,直接可以在命令行里面使用。

-2. hwi其实就是hive web interface的缩写,它是Hive的Web接口,是hive cli的一个web替换方案。

-3. jar与Hadoop jar等价的Hive的接口,这是运行类路径中同时包含Hadoop和Hive类的Java应用程序的简便方式。

 


 

十, Hive的压缩

hive的压缩依赖mapreduce,所以先检验本机的hadoop支持哪些压缩格式。

查看本机hadoop可以使用的压缩格式:bin/hadoop checknative

1. 设置本机hadoop支持Snappy压缩

Snappy是一个Google开源的由C++ 编写的用来压缩和解压缩的开发包。其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率。

优点:高压压缩速度和合理的压缩比;

缺点:不支持split;压缩率不是很高(没有zlib高);hadoop本身不支持,需要自行编译源码。

-1. 下载安装snappy

-2. 编译 hadoop 2.x(官方提供的hadoop不支持snappy压缩)

编译命令:mvn package -Pdist,native -DskipTests -Dtar -Drequire.snappy

在源码的 BUILDING.txt 文件中,对Snappy压缩编译的注释:

 

-3. 将本机hadoop lib目录下的native,替换成编译后的安装包中的native

编译后hadoop包目录:/opt/modules/hadoop-2.5.0-src/target/hadoop-2.5.0/lib/native

 

2. hive中支持压缩的位置

-1. 处理的数据设置压缩,也就是表中的数据设置压缩

创建表的时候设置:stored as orc tblproperties ("orc.compress"="NONE");

map input的时候进行解压

-2. map 输出的文件可以设置压缩(参数设置)

reduce 拷贝 map端的结果文件之后解压

-3. reduce输出的数据设置压缩,也就是最终结果文件设置压缩(参数设置)

Hive中(MapReduce中)的压缩示意图

 

 

3. 设置map阶段和reduce阶段数据进行压缩(和mapreduce中设置的参数一样)

-1. 设置map输出压缩的几个属性

mapreduce.map.output.compress

false

mapreduce.map.output.compress.codec

org.apache.hadoop.io.compress.DefaultCodec

-2. 设置reduce输出,即output输出文件压缩的几个属性

mapreduce.output.fileoutputformat.compress.type:压缩的类型(单条数据或者数据块)

RECORD,单条记录的压缩;

BLOCK,可以压缩一组记录,一般推荐使用这个,有更好的压缩比。

mapreduce.output.fileoutputformat.compress

false

mapreduce.output.fileoutputformat.compress.type

NONE, RECORD or BLOCK

mapreduce.output.fileoutputformat.compress.codec

org.apache.hadoop.io.compress.DefaultCodec

 


 

十一, Hive中的数据存储

Hive文件存储格式官网链接https://cwiki.apache.org/confluence/display/Hive/SerDe

1. 几种Hive支持的存储格式了解

-1 TEXTFILE默认的存储格式

-2. RCFILE0.6.0开始支持,列式存储

-3. ORC0.11.0开始支持(压缩比更大,大约是textfile的7倍,比parquet大的多)

a. Hadoop生态圈中的列式存储格式,2013年初产生,2015年提升为Apache*项目。

b. 压缩快、快速列存取率比rcfile高,是rcfile的改良版本。

c. 最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

d. 存储方式类似于parquet,根据行组分割整个表,每一个行组内按列存储,以二进制方式存储

e. ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。

f. 目前也被Spark SQL、Presto等查询引擎支持,但是Impala对于ORC目前没有支持。

-4. PARQUET:0.13.0开始支持,0.10-0.12使用需要自己下载 Parquet Hive包

a. Parquet比较复杂,2015年5月成为Apache*项目,是Hadoop生态圈中一种新型列式存储格式

b. 兼容Hadoop生态圈中大多数计算框架(Mapreduce,Spark等),支持多种查询引擎(Hive,Impala等)

c. 列式存储格式,高效压缩和编码,且使用更少的IO。

d. Parquet存储结构支持嵌套数据结构以及高效且种类丰富的算法,以应对不同值分布特征的压缩。

e. 表非常宽(column非常多)的时候,Parquet无论在资源利用率还是性能上都优势明显。

 

2. ORC详解

-1. ORC文件结构

ORC文件,由一个File Footer(文件页脚),一个Postscript(附言,备注)和若干个Stript(行数据)组成

Postscript(附言,备注)保存压缩参数和压缩页脚的大小,在文件末尾

File Footer(文件页脚)保存文件的辅助信息,包含文件中的条带列表,每个条带的行数以及每列的数据类型。

Stript(条带)默认条带大小为250 MB。大的条带大小可以实现从HDFS读取大量高效的数据。

如下图所示,ORC文件中的每个Stripe(条带)都保存Index Data(索引数据),Row Data(行数据)和Stripe Footer(行数据页脚)。

Stripe Footer(行数据页脚)包含流位置的目录。

Row Data(行数据)用于表扫描,保存的是真正的数据。

Index Data(索引数据)包括每列的最小值和最大值以及每列中的行位置。行索引条目提供可以在解压缩块内寻找正确的压缩块和字节的偏移量。ORC索引仅用于查询行数据位置,而不用于应答查询。

ORC文件结构:

 

-2. 指定文件格式的三种设置方法:(不指定默认textfile)

a. 创建表时指定文件格式:create table test(name string) stored as orc;

b. alter table修改文件格式:(也可以指定单个分区)

alter table test [ partition partition_condition ] set fileformat orc;

c. set 设置创建表默认的文件格式:set hive.default.fileformat=orc;

-3. 指定数据格式,可以在tblproperties 设置相关参数

例如,创建一个没有压缩的ORC存储表:

create table test(

name string, street string ) stored as orc tblproperties ("orc.compress"="NONE");

orc 文件格式tblproperties参数列表(后两个参数在创建hive和hbase集成表的时候会用到)

参数

默认值

说明

orc.compress

ZLIB

高级压缩(NONE,ZLIB,SNAPPY之一)

orc.compress.size

262,144

每一个压缩快字节数大小

orc.stripe.size

268435456(256MB)

每个条带中的字节数

orc.row.index.stride

10,000

索引条目之间的行数(必须> = 1000)

orc.create.index

true

是否创建行索引

orc.bloom.filter.columns

""(无)

创建bloom过滤器的列名称,逗号分隔

orc.bloom.filter.fpp

0.05

bloom过滤器的假正概率(必须> 0.0和<1.0)

 


 

十二, Hive的优化

1. Hive查询语句的调优 —— Fatchtask优化

Fatchtask优化:hive自身的一种优化,直接抓取数据不运行mapreduce程序,可选值minmal/more

默认值 minimal:select * 查询,分区表一个分区数据的查询,Limit查询 不运行mapreduce程序。

优化值 more:优化之后,hive单独列的查询,where过滤查询,以及虚拟列(列的查询另外形式,如使用函数等对列的处理)的查询等也不运行mapreduce程序。(只要不是join,排序,分区基本都可以)

配置参数 hive.fetch.task.conversion:

<property>

<name>hive.fetch.task.conversion</name>

<value>minimal</value>

<description>

Some select queries can be converted to single FETCH task minimizing latency.

Currently the query should be single sourced not having any subquery and should not have

any aggregations or distincts (which incurs RS), lateral views and joins.

1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only

2. more : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)

</description>

</property>

 

 

2. 设置Hive本地模式(在本地运行,不需要启动yarn)

hive.exec.mode.local.auto=true

当一个job满足如下条件才能真正使用本地模式:

-1. job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)

-2. job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)

-3. job的reduce数必须为0或者1

 

3. 大表的拆分

如果只是针对大表的某几列操作就创建子表进行操作;

操作语句:create table emp_name as select name from emp

 

4. 外部表和分区表的使用(通常在企业是结合使用的)

a. 多个部门共用一个表的时候使用分区表,

b. 使用多级分区表实现优化,一般二级分区就可以。

 

5. 存储格式和数据压缩的优化

a. 一般数据格式选用 orc/parquet,压缩格式一般选用 snappy,注意orc默认压缩格式zlib

b. 设置压缩的三个位置,输入文件的压缩,map输出的压缩,reduce输出的压缩。

 

6. 优化HQL语句

a. join语句的优化,例如链接两个表的时候,先子查询再链接

 

b. join的三种类型:

reduce Join发生在reduce阶段,大表对大表,利用MapReduce会对相同的Key进行分组的特性

map输出key设置为join的列,输出的value为组合字段(标签+除了join列剩余的数据)

Map Join发生在Map阶段,一般是大表对小表的Join,利用的是 DistributedCache

SMB JoinSort-Merge-Bucket。对两个大表join的优化策略。选取相对小的表将其参与join的key抽取出来,保存到文件File中,然后将文件放到内存中。在map阶段,使用DistributedCache将File复制到各个map任务主机上,然后过滤掉另外一张表(文件)中不在File中的key的数据记录,剩下的reduce阶段的工作与reduce side join相同。

设置MSB Join的三个属性:

set hive.auto.convert.sortmerge.join = true; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true;

 

7. 查看任务执行计划

语法使用:EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query

例如:Explain select * from emp;

Explain extended select * from emp; [ 打印出更多的扩展信息 ]

执行计划输出内容

-1. 查询语句的抽象语法树

-2. 执行计划不同阶段间的依赖关系

-3. 每个阶段的描述

 

8. 并行计算优化(取值一般在10-20)

参数

默认值

说明

hive.exec.parallel

false

是否开启并行执行

hive.exec.parallel.thread.number

8

并行执行的任务个数

 

9. JVM重用(取值一般在1-9,一般为5)

参数

默认值

说明

mapreduce.job.jvm.numtasks

1

 

 

10. map数目的优化(默认情况下由块的大小决定)

参数

默认值

说明

hive.merge.size.per.task

256000000

 

 

11. reduce数目的优化

参数

默认值

说明

mapreduce.job.reduces

1

设置reduce的任务个数

 

12. 推测执行

推测执行默认是开启的,主要是当一个reduce出现问题的时候,AplicationMaster会再执行一个reduce任务,这两个哪个先执行完,就算任务执行。在Hive中要把推测执行关闭,因为Hive处理大量数据,速度本来就很慢,如果开启推测执行,系统会对默认执行时间过长的任务出现问题,会重新开启一个reduce任务,相当占用资源。

开启推测执行的三个属性:(三个参数都要设置为false)

参数

默认值

hive.mapred.reduce.tasks.speculative.execution

true

mapreduce.map.speculative

true

mapreduce.reduce.speculative

true

 

13. 动态分区

-1. 参数设置(主要是前两个)

参数

默认值

说明

hive.exec.dynamic.partition

false

是否开启动态分区

hive.exec.dynamic.partition.mode

strict

nostrict:允许所有分区都是动态的

strict:表示必须保证至少有一个分区是静态的

hive.exec.max.dynamic.partitions

1000

一个动态分区创建语句可以创建的最大分区数

hive.exec.max.dynamic.partitions.pernode

100

每个mapper或reducer可以创建的最大动态分区个数

hive.exec.max.created.files

100000

全局可以创建的最大文件个数

-2. 创建分区表

create table yhd_part2(

id string,

url string,

guid string

)

partitioned by (date string,hour string)

row format delimited fields terminated by ' ';

-3. 加载数据(和静态分区不同的地方)

动态分区加载数据:

insert into table test_part2 partition (date,hour) select * from test;

静态分区加载数据:

insert into table test_part1 partition(date='20150828',hour='18')

select id,name from test where date='20150828' and hour='18';

insert into table test_part1 partition(date='20150828',hour='19')

select id,name from test where date='20150828' and hour='19';

 

14. 严格模式(一般会开启,来实现系统优化)

参数

默认值

说明

hive.mapred.mode

nonstrict

是否开启严格模式,strtic(开启严格模式)

严格模式主要是对sql语句的检验,开启严格模式对以下3种情况不能执行:

1. 分区表,不加分区字段过滤查询,不能执行;

2. order by 必须使用 limit 语句限制

3. 限制笛卡尔积查询(join的时候不适用 on ,而使用where)

eg:sleect * from A join B where A.name=B.name and A.id=B.id;

 


 

十三, hive元数据

参考网站:http://www.2cto.com/database/201311/255627.html

 

1. DBS表(Database表):该表存储Hive Database的元数据信息

2. TBLS(Table 表):存储Hive Table的元数据信息,

3. COLUMN_V2(字段表):该表存储了一个CD_ID对应的所有字段信息

4. SDS表(数据存储表):保存了Hive数据仓库所有的HDFS数据文件信息

5. PARTITIONS PARTITION_KEY 和 PARTITION_KEY_VALS  (分区表信息)

PARTITION_KEYS 保存了所有分区表用于分区的字段

PARTITIONS存储了Hive数据仓库总所有的分区信息

PARTITION_KEY_VALS 存储了PARTITION_KEY中描述的分区字段的值,通常配合 PARTITIONS 和PARTITION_KEYS表使用