Hive起源于Facebook,是基于 Hadoop HDFS 分布式文件系统的分布式 数据仓库 架构。它为数据仓库的管理提供了许多功能:数据ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。同时Hive还定义了类SQL的语言(HiveQL)。容许用户进行和SQL类似的操做,它能够将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能。还容许开发人员方便的使用Mapper和Reducer操做,能够将SQL语句转换为MapReduce任务运行。mysql
Hive做为Hadoop之上的数据仓库处理工具,它全部的数据都是存储在Hadoop兼容的文件系统中。Hive在加载数据过程当中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下。所以,Hive不支持对数据的修改和添加,全部的数据都是在加载的时候肯定的。sql
Hive 最大的特色是经过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易。数据库
数据是存储在 HDFS 上的,Hive 自己并不提供数据的存储功能架构
Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息通常存在关系型数据库上(好比 MySQL)。app
数据存储方面:它可以存储很大的数据集,而且对数据完整性、格式要求并不严格。分布式
数据处理方面:不适用于实时计算和响应,使用于离线分析。函数
Hive支持关系数据库中大多数据基本数据类型,同时还支持三种复杂类型。工具
示例:oop
-- 直接建表法
create table t_page_view (
page_id bigint comment '页面ID',
page_name string comment '页面名称',
page_url string comment '页面URL'
)
comment '页面视图'
partitioned by (ds string comment '当前时间,用于分区字段')
stored as parquet
location '/user/hive/warehouse/t_page_view';
-- 查询建表法
create table t_page_view2 as select * from t_page_view;
-- like建表法(克隆表)
create table t_page_view3 like t_page_view;
复制代码
Hive中默认建立的是内部表,内部表的数据由Hive来管理。在 drop
表的时候,表的数据和元数据都会被删除。性能
CREATE TABLE pokes (
foo INT,
bar STRING
);
复制代码
外部表的数据不禁Hive管理。Hive能够建立外部表和 HDFS、HBase 和 Elasticsearch 等进行整合。drop
外部表时,只会删除元数据,不会删除真实数据。外部表关键字EXTERNAL
。
CREATE EXTERNAL TABLE IF NOT EXISTS tb_station (
station string,
lon string,
lat string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/test/coordinate/';
复制代码
内部表与外部表转换
-- 内部表转外部表
alter table tableA set TBLPROPERTIES('EXTERNAL'='true');
-- 外部表转内部表
alter table tableA set TBLPROPERTIES('EXTERNAL'='false');
复制代码
Hive表的数据是存储在HFDS中对应的目录中,普通表的数据直接存储在这个目录下,而分区表存储时,会再划分子目录来存储,一个分区对应一个子目录。主要做用是来优化查询性能。在Hive表查询的时候,若是指定了分区字段做为筛选条件,那么只须要到对应的分区目录下去检索数据便可,减小了处理的数据量,从而有效的提升了效率。在对分区表进行查询时,尽可能使用分区字段做为筛选条件。
CREATE TABLE invites (
foo INT,
bar STRING
)
PARTITIONED BY (ds STRING);
复制代码
分桶是将数据分解成更容易管理的若干部分的技术,桶表示对数据源数据文件自己来拆分数据。桶是更为细粒度的数据范围划分。Hive采用对列进行哈希,而后对桶的个数取模的方式决定该条记录存放在哪一个桶当中。
建立桶表时,须要指定桶的个数,分桶的依据字段,Hive就能够自动将数据分桶存储。
查询时,只须要遍历一个桶里的数据,或者遍历部分桶,这样就提升了查询效率。
示例:
CREATE TABLE ods.tb_ad_action_d (
op_time STRING,
user_id STRING,
task_id STRING,
event_name STRING
)
CLUSTERED BY (user_id)
SORTED BY(task_id)
INTO 10 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
复制代码
user_id
的值进行哈希后模除分桶个数,根据获得的结果,肯定这行数据分入哪一个桶中。Database
-- 建立database
create database IF NOT EXISTS ods;
USE database_name;
USE DEFAULT;
-- 删除database
drop database if exists ods;
复制代码
Table
-- 建立内部表(默认)
create table trade_detail(
id bigint,
account string,
income double,
expenses double,
time string)
row format delimited
fields terminated by '\t';
-- 建立分区表
create table td_part(
id bigint,
account string,
income double,
expenses double,
time string)
partitioned by (logdate string)
row format delimited
fields terminated by '\t';
-- 建立外部表
create external table td_ext(
id bigint,
account string,
income double,
expenses double,
time string)
row format delimited
fields terminated by '\t'
location '/data/td_ext';
-- 建立外部分区表
create external table td_part_ext(
id bigint,
account string,
income double,
expenses double,
time string)
partitioned by (logdate string)
stored as parquet tblproperties("parquet.compress"="SNAPPY")
location '/data/td_part_ext';
drop table if exists td_part_ext;
复制代码
Alter
-- 修改代表
ALTER TABLE page_view RENAME to page_view_new;
-- 修改字段
ALTER TABLE page_view CHANGE ip ip_address string AFTER refererurl;
-- 添加字段
ALTER TABLE page_view ADD COLUMNS (name string comment 'view name');
-- 添加分区
ALTER TABLE page_view ADD IF NOT EXISTS PARTITION (dt='20190705') LOCATION='/data/page_view/dt=20190705';
-- 修改location
ALTER TABLE page_view PARTITION(dt='20190706') SET LOCATION "/data/page_view/dt=20190706";
-- 修改分隔符
ALTER TABLE page_view SET SERDEPROPERTIES ('field.delim' = ',');
-- 删除分区
ALTER TABLE page_view DROP PARTITION (dt='2008-08-08', country='us');
复制代码
Show
-- 查看建立表语句
show create table td_part;
-- 查看表分区
show partitions td_part;
复制代码
修复分区
-- 修复分区
msck repair table page_view;
复制代码
数据导入
-- 将本地文件导入到hive
load data local inpath '/home/hadoop/student' overwrite into table student partition(state='Sichuan', city='Chengdu');
-- 将hdfs上文件导入到hive
load data inpath '/user/hadoop/add.txt' into table student partition(state='Sichuan', city='Chengdu');
-- 从别的表中查询出相应的数据并导入到hive表中
insert into table test partition(age='25') select id ,name from wyp where age='25';
-- 在建立表的时候经过从别的表中查询出相应的记录并插入到所建立的表中
create table tmp as select * from student where age>'18';
复制代码
数据导出
-- 导出到本地文件系统
insert overwrite local directory '/home/hadoop/student' select * from student;
-- 导出到hdfs
insert overwrite directory '/user/hadoop/student' select * from student;
-- 将查询结果插入到表中(追加)
insert into table student_new select id,name from student where age='25';
-- 将查询结果插入到表中(覆盖)
insert into table student_new select id,name from student where age='25';
复制代码
用户自定义普通函数,用于处理单行数据,并生成单个数据行。用来自定义完成对字段处理的函数。
聚合函数,多对一,多行变一行,需和group by联合使用。
表生成函数,一对多,一行变多行。