设为首页 加入收藏

TOP

Hive使用入门
2019-05-02 01:03:07 】 浏览:49
Tags:Hive 使用 入门

Hive提供了一个被称为Hive查询语言(简称HiveQL或者HQL)的SQL语言,用来查询和存储在Hadoop集群中的数据。Hive不是一个完整的数据库,不支持记录级别的更新、插入或者删除操作,Hive将查询语句转换成MapReduce任务,因此Hive查询延时比较大。Hive不支持OLTP(联机事务处理)所需的关键功能,更接近一个OLAP(联机分析技术)工具;适合用于数据仓库应用程序,使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化。本文作为Hive的入门篇,主要介绍Hive表的创建,数据的装载等。

  • 创建/删除数据库

声明:Hive对关键字的大小写不敏感
Hive中数据库的概念本质上是一个目录或者命名空间。Hive会为每个数据库(默认的default除外)创建一个目录,数据库中的表将会以这个数据库目录的子目录形式存在。

hive> create database peopleinfo;    //创建数据库peopleinfo,如果已经存在将会抛出异常
hive> create database if not exists peopleinfo;  //创建之前判断peopleinfo是否已经存在
hive> show databases;   //查看当前所包含的数据库
hive> describe database peopleinfo;   //显示peopleinfo数据库的详细信息
hive> drop database peopleinfo;   //删除数据库
hive> drop database peopleinfo if exists peopleinfo;
hive> use peopleinfo;  //切换数据库
  • 创建表

在建表时,如果没有显式的指定数据库,将会使用默认的数据库default。例如:

hive> create table people (
    > name string,
    > city string,
    > age int
    > ) row format delimited fields terminated by '\t';

上述创建了people表,字段及其类型如上,并且指定了待装载数据的格式是以tab键分隔(即在装载数据时,会将tab键分隔的行数据映射到数据仓库)。可以通过下面的语句显示创建表的详情:

hive> describe formatted people;    //通过formatted以更友好的格式展示描述数据
OK
# col_name              data_type               comment             
name                    string                                      
city                    string                                      
age                     int                                         
# Detailed Table Information         
Database:               default                  
...
Location:               hdfs://localhost/hive/people       
Table Type:             MANAGED_TABLE            
Table Parameters:        
    COLUMN_STATS_ACCURATE   true                
    numFiles                1                   
    totalSize               93                  
    transient_lastDdlTime   1505994401          
# Storage Information        
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe   
InputFormat:            org.apache.hadoop.mapred.TextInputFormat     
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat   
...
Storage Desc Params:         
    field.delim             \t                  
    serialization.format    \t                  

创建表时还有许多可选关键字用于描述其他的选项,如下:

CREATE EXTERNAL TABLE IF NOT EXISTS peopleinfo.people(
name string COMMENT 'name field',  //用于向每个字段追加一个注释
...
)
COMMENT 'detail info of people'   //COMMENT:表的注释
row format delimited fields terminated by '\t'     //行数据中每个字段的分隔符
LINES TERMINATED BY ‘\n’   //数据行间的分隔符,默认为'\n'
TBLPROPERTIES ('creator'='xx','created_at'='2017**')  //按键值对的格式为表增加额外的文档说明
location 'xxx'    //指明数据的存储位置
STORED AS file_format;   //文件的存储格式,默认为'\n'
EXTERNAL:声明创建的表为外部表
IF NOT EXISTS:如果创建时表已经存在,hive将会忽略掉后面的执行语句
peopleinfo.:指明表所属的database

关于”fields terminated”的默认分隔符:基本数据类型默认为’\001’,ARRAY或者STRUCT类型默认为’\002’,map中默认为’\003’;
关于Hive支持的数据类型参见文献[1];
关于外部表:Hive表可以用LOCATION告诉Hive数据位于哪个路径下,Hive不会完全的用于这份数据,事实上Hive中只保存相关的元素信息,不会像内部表一样将数据移动到自己管理的目录,因此,删除外部表时,只会删除描述表的元数据信息,而不会删除表中数据。这和内部表时不同的,内部表会将数据放到自己的数据仓库中,删除表时,元数据和表中数据将会被一起删除。
还可以通过select语句创建表,例如以下从people中筛选city为nanjing的信息,创建njpeople表,该表数据default数据库。

hive> create table njpeople as 
    > select name,age from people where city='nanjing';
  • 向表中装载数据

例如向之前的people表中载入数据:

load data [local] inpath 'xxx' [overwrite] into table people;

LOCAL:指定从本地文件系统装载数据,该数据会被拷贝到目标位置;如果不指定LOCAL关键字的话,表示数据会从HDFS(或其他分布式文件系统)中装载数据,且数据会被移动到目标位置。
OVERWRITE:目标文件夹中之前存在的数据会被删除。

hive> load data local inpath '/home/test/people.bcp' into table people;
...
hive> select * from people;
OK
ZHAO    beijing 30
QIAN    nanjing 26
SUN nanjing 28
LI  shanghai    NULL   //!!!注意NULL!!!
ZHOU    shanghai    29

people表在HDFS上存储的数据:

hive> dfs -cat /hive/people/people.bcp;
ZHAO    beijing 30
QIAN    nanjing 26
SUN nanjing 28
LI  shanghai    age
ZHOU    shanghai    29

hive的读时模式,也就是在查询时对数据进行校验,如果模式和文件内容并不匹配,Hive会极力尝试尽可能的将各种错误恢复过来,例如数据”LI shanghai age”中的age与表定义的int类型并不匹配,查询时,将返回NULL。

通过查询语句向表中插入数据

hive> insert into table njpeople
    > select * from people where city='nanjing';
  • 数据导出
hive> insert overwrite local directory '/home/test/people' row format delimited fields terminated by '\t' select * from people;
LOCAL[可选]:local表示数据导出到本地磁盘,否则数据导出到HDFS
OVERWRITE[可选]:目标文件夹中之前存在的数据会被删除。
  • 删除表
hive> drop table tablename; //直接丢弃
hive> drop table if exists tablename; //带有if的判断语句
  • 修改表

表重命名:

alter table tablename01 rename to tablename02;

增加列:

alter table tablename01 add columns(
field1 string comment 'add field string',
field2 int comment 'add field int'
);

删除/替换列:

alter table people replace columns(
firstname string,
location string,
nianling  int
);

因为新的字段和原来的字段数相同,因此上述操作实际上只是重定义了字段的名称。如果是”alter table people replace columns(firstname string);”,那么会重命名name字段的元数据信息,并且删除city和age属性。

  • 数据抽取

在Hive中提供了数据取样(SAMPLING)的功能,用来从Hive表中根据一定的规则进行数据取样,Hive中的数据取样支持分桶表取样和数据块取样。例如,分桶表取样:

hive> select * from people TABLESAMPLE(bucket 2 out of 5 on rand()) s;

更详见的介绍可以参考:从Hive表中进行数据抽样-Sampling


  1. Edward Capriolo,Dean Wampler,Jason Rutherglen 著;曹坤 译. Hive编程指南. 人民邮电出版社,2013.
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hive函数,hive自定义函数,hive.. 下一篇Alex 的 Hadoop 菜鸟教程: 第10课..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目