文档章节

HiveQL:数据定义

LeeHH
 LeeHH
发布于 2017/02/09 17:35
字数 1310
阅读 42
收藏 1

Hive中的数据库

创建数据库

正常普通的创建:

hive> create database financials;

加判断的创建(如果数据库不存在才创建,防止抛出错误信息):

hive> create database if not exists financials;

规定数据库存放位置的创建:

hive> create database financials location '/my/database';

增加描述信息的创建:

hive> create database financials comment 'holds all financial tables';

hive> describe database financials;
financials      holds all financial tables      file:/home/me/hive/warehouse/financials.db

增加一些键值对属性信息的创建:

hive> create database financials with dbproperties('creator'='Leon','date'='2017-02-09');

hive> describe database extended financials;
financials              file:/home/me/hive/warehouse/financials.db      {date=2017-02-09, creator=Leon}

设置当前工作数据库

和mysql一样,用use:

hive> use financials;

通过设置打印当前数据库的属性,可以知道当前所在的数据库:

hive> set hive.cli.print.current.db=true;

hive (default)> 

查找数据库

正常的打印所有数据库(命令和mysql的一毛一样):

hive> show databases;

拿正则表达式匹配来刷选的数据库(下面的例子是刷选出以f开头,其他字符结尾的数据库名):

hive> show database like 'f.*';

修改数据库

可以用alter database来为数据库的dbproperties设置键值对属性,但是数据库名和所在位置不能修改:

hive> alter database financials set dbproperties('user'="Leon");

删除数据库

还是用drop:

hive> drop database financials;

 

Hive中的表

创建表

基本语法与mysql相同,关键字(comment,tblproperties)与上面的创建数据库时的对应关键字的效果相同:

hive> create table if not exists mydb.employees(
name                 string comment 'Employee name',
salary               float comment 'Employee salary',
subordinates         array<string> comment 'Name of subordinates',
deductions           map<string, float>
                     comment 'keys are deductions name,values are percentages',
address              struct<street:string,city:string,state:string,zip:int>
                     comment 'Home address')
comment 'description of the table'
tblproperties ('creator'='Leon','create_at'='2017-02-09 12:00');

通过拷贝一张已经存在表的表模式来创建表:

hive> create table if not exists mydb.employees2 like mydb.employees;

查找表

很普通的查当前数据库下的表:

hive> use mydb;

hive> show tables;

直接查找某个数据库下的表:

hive> show tables in mydb;

和数据库的查找一样,同样可以用正则表达式来刷选:

hive> show tables 'empl.*';

查看表的描述(tableType:MANAGED_TABLE表示该表为管理表,如果值为EXTERNAL_TABLE则表示该表为外部表,后面会讲到外部表的创建):

hive> describe extended employees;

创建一张外部表

因为是外部表,Hive会认为并非完全拥有这份数据,因此,删除该表并不会删除该份数据,不过描述表的元数据信息会被删除掉(以下命令将创建一个外部表,其可以读取所有位于/data/stocks 目录下的以逗号分隔的数据):

hive> create external table if not exists stocks (
exchange         string,
symbol           string,
ymd              string,
price_open       float,
price_high       float,
price_low        float,
price_close      float,
volume           int,
price_adj_close  float)
row format delimited fields terminated by ','
location '/data/stocks';

分区表

假设现在雇员过多,遍布世界各地,然后我们要按照address中的country和state来分区,那么命令就是:

hive> create table employees1(
name               string,
salary             float,
subordinates       array<string>,
deductions         map<string,float>,
address            struct<street:string,city:string,state:string,zip:int>
)
partitioned by(country string,state string);

可以用 show partitions 来查看表中存在的所有分区:

hive>  show partitions employees1;

查询时,如果只想查询某个特定分区键的分区的话,可以使用partition子句:

hive> show partitions employees1 partition(country='CN');

外部分区表

创建一张外部分区表:

hive> create external table if not exists log_message(
hms         int,
severity    string,
server      string,
process_id  int,
message     string)
partitioned by (year int,month int,day int)
row format delimited fields terminated by '\t';

自定义表的存储格式

Hive的默认存储方式是文本文件格式,这个可以通过可选的子句stored as textfile显式指定,同时可以在建表时指定各种各样的分隔符,比如:

hive> create table employees3(
name           string,
salary         float,
subordinates   array<string>,
deductions     map<string,float>,
address        struct<street:string,city:string,state:string,zip:int>
)
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;

删除表

和删除数据库是很类似的:

hive> drop table if exists employees;

修改表

给表重命名:

hive> alter table log_message rename to logmsgs;

增加表分区:

hive> alter table logmsgs add if not exists
partition(year=2017,month=1,day=1) location 'logs/2017/01/01'
partition(year=2017,month=1,day=2) location 'logs/2017/01/02'
...

修改表分区:

hive> alter table logmsgs partition(year=2017,month=02,day=09)
set location '/usr/log/2017/02/09'

删除表分区:

hive> alter table logmsgs drop if exists partition(year=2017,month=01,day=01);

修改列信息:

hive> alter table logmsgs
change column hms hours_minutes_seconds int
comment 'The hours,minutes and seconds part of the timestamp'
after severity;

增加列:

hive> alter table logmsgs add columns(
app_name string comment 'Application name',
session_id long comment 'The current session id');

删除或者替换列:

hive> alter table logmsgs replace columns(
hours_minutes_second int comment 'The hours,minutes and seconds part of the timestamp',
severity         string comment 'The message severity'
message          string comment 'The rest of the message');

修改表属性(可以增加或修改属性,但是无法删除):

hive> alter table logmsgs set tblproperties(
'notes'='The process id is no longer captured;this column is always NULL'
)

修改存储属性:

hive> alter table logmsgs 
partition(year=2017,month=01,day=01)
set fileformat sequencefile;

给分区加NO_DROP属性防止分区被删除:

hive> alter table logmsgs
partition(year=2017,month=02,day=01) enable NO_DROP;

给分区加OFFLINE属性防止分区被查询:

hive> alter table logmsgs
partition(year=2017,month=02,day=01) enable OFFLINE;

 

© 著作权归作者所有

LeeHH
粉丝 1
博文 36
码字总数 36305
作品 0
深圳
程序员
私信 提问
从SQL到HiveQL应改变的几个习惯

2009-10-30 @ taobao 引言 别名 虚拟列 IN INNER JOIN 分号字符 Insert Merge IS [NOT] NULL 引言 HiveQL非常像SQL,但二者并非等价,若不注意期间的一些差异,容易导致HiveQL的语义错误,或...

zhongl
2011/09/23
14K
0
Impala SQL 语言参考

Impala SQL 语言参考 Cloudera Impala 的查询语言是基于 SQL 的。为了保护用户在技能和查询设计方面的已有投资,Impala 提供与 Hive 查询语言(HiveQL)的高度兼容: 因为使用与 Hive 记录表结...

weiqingbin
2013/12/20
11.1K
1
Hadoop Hive sql 语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功...

luanpeng825485697
2018/05/30
0
0
Hive架构及Hive On Spark

Hive的所有数据都存在HDFS中. (1)Table:每个表都对应在HDFS中的目录下,数据是经过序列化后存储在该目录中。同时Hive也支持表中的数据存储在其他类型的文件系统中,如NFS或本地文件系统。 (2...

雪童子
2015/10/23
0
0
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(二)

二、按需装载 前面已经做了“初始装载”和“定期装载”。还有一种需要熟悉的装载类型,按需装载。所谓“按需装载”指的是,在正常调度之外,当源数据有效或者数据仓库需要时进行装载。例如,...

wzy0623
2016/07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
2
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部