Hive

概述

  1. Hive是Hadoop的的子工程,后来被独立出来成为Apache的顶级项目
  2. Hive是Apache提供的一套基于Hadoop的进行数据仓库管理的工具,提供了读写以及管理大量数据的功能
  3. Hive提供了大量的类SQL(Hive QL,简称HQL)来对Hadoop的数据进行操作,底层会将SQL转换为MapReduce来执行,所以适合离线处理
  4. 每一个Database都会在HDFS上对应一个目录
  5. Hive中没有主键的概念
  6. 在Hive中,一个表创建好之后,字段之间的间隔符号就无法更改了
  7. Insert into表示追加,Insert overwrite表示覆盖(如果新插入的内容为空,就相当于清空表)
  8. 因为Hive操作的是HDFS上的数据,所以Hive不提供修改和删除命令。数据不能删除,但是目录可以删除

HQL

解释

show databases;

显示所有数据库

create database demo;

创建

drop database demo;

删除表

load data local inpath ‘/home/hivedemo/person.txt’ into table person;

从本地文加载数据

truncate table …

清空表数据

create table … like …

创建一个一样的表

insert overwrite local directory ‘/home/hivedata’ row format delimited fields terminated by ’ ’ select * from person where age <= 19;

将hive(hdfs)中的数据放到本地,必须用overwrite,这个路径必须不存在

insert overwrite directory ‘/person’ row format delimited fields terminated by ‘,’ select * from person where id <= 3;

将表中数据查询出来放到HDFS下,只能用overwrite,用into报错

alter table … rename to …

修改表名称

alter table p5 add columns(gender String,address String);

添加列,初始值为null

表结构

  1. 内部表:在Hive中手动创建表、手动添加数据的表
  2. 外部表:在Hive中,需要创建表来管理HDFS中已经存在的数据
  • 创建表语句:create external table flow (phone String,city String,name String,flow int) row format delimited fields terminated by ’ ’ location ‘/txt/flow’;
  • 内部表被删除时对应的目录会立即从HDFS中移除,外部表被删除时对应的数据并不会删除
  • 在实际生产过程中,一般在数据处理时回先创建一个外部表
  1. 分区表:
  • 作用:对数据进行分类
  • 建表语句:create table citied (id int,name String )partitioned by(province string) row format delimited fields terminated by ’ ';
  • 加载数据:load data local inpath ‘/home/hivedemo/guangdong.txt’ into table cities partition(province = ‘guangdong’);
  • 每一个分区在HDFS上对应一个目录,如果在查询的时候指定了分区,那么查询效率就相对而言较高,如果查询时跨分区,效率就较低
  • 批量修复:msck repair table cities;,就是添加所有的分区
  • 删除分区:alter table cities drop partition(province = ‘henan’)
  • 修改分区名:alter table cities partition(province=‘shanxi’) rename to partition(province=‘hebei’)
  • 多字段分区:在Hive中,允许使用多字段分区,前一个字段形成的目录会包含后一个字段,而在实际开发中,如果数据存在大类小类分区的情况,那么就需要使用多字段分区,例如:年级-班级,省-市-区等
  • 建表语句:crete table student (id int,name string )partitioned by (grade string,class string)row format delimited fields terminated by ’ ’
  • 加载数据:load data local inpath ‘/home/hivedemo/g1c1.txt’ ubti table student partition(grade = ‘1’,class = ‘1’);
  • 在Hive中,分区表中的分区字段在原始数据中是并不存在的,而是加载的数据手动指定的
  • 动态分区:如果分区字段已经被包含在原始数据中,那么需要使用动态分区
  1. 先创建一个表来管理原始数据
  2. 加载数据
  3. 开启非严格模式:set hive.exec.dynamic.partition.mode=nonstrict;
  4. 动态分区-从未分区表中查询数据放到已经分区的表中:insert into table cities partition(province )select cid,cname.cpro from c_tmo distribute by cpro;
  1. 分桶表:
  • 分桶表的作用是对数据进行抽样
  • 实例:
  • 开启分桶机制:set hive.enforce.bucketing = true;
  • 建立分桶表:根据name字段分桶,将数据分到6个桶中,在底层会先计算name字段的值得到哈希码,然后对哈希码进行二次运算,使得这个值落到6个桶中的某一个上:create table c_bucket(id int,name string) clustered by(name) into 6 buckets row format delimited fields terminated by ’ ';向分桶表中添加数据,只能insert方式添加才能分桶,不能利用load的方式进行添加
  • 抽样:bucket X out of Y,X表示起始桶的编号,Y表示步长,bucket 1 out of 3 表示从1号桶开始抽取,每隔3个桶抽一次:select * from c_bucket tablesample(bucket 1 out of 3 on name)
  • 分桶表的核心思想是先根据值的哈希码来进行分桶(实际上就是数据被打散到各个桶中),然后再抽取指定的桶的数据
  • 一个表既可以是分区表也可以是分桶表,先对数据进行分类,分类只有在对每一类数据进行抽样