Hive中的数据库(Database)和表(Table)
在前面的文章中,介绍了可以把Hive当成一个“数据库”,它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table)。
本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的、基础的。
二、Hive的数据库和表
先看一张草图:
Hive结构
从图上可以看出,Hive作为一个“数据库”,在结构上积极向传统数据库看齐,也分数据库(Schema),每个数据库下面有各自的表组成。
1. Hive在HDFS上的默认存储路径
Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.
2. Hive中的数据库(Database)
- 进入Hive命令行,执行show databases;命令,可以列出hive中的所有数据库,默认有一个default数据库,进入Hive-Cli之后,即到default数据库下。
- 使用use databasename;可以切换到某个数据库下,同mysql;
- hive> show databases;
- OK
- default
- lxw1234
- usergroup_mdmp
- userservice_mdmp
- Time taken: 0.442 seconds, Fetched: 4 row(s)
- hive> use lxw1234;
- OK
- Time taken: 0.023 seconds
- hive>
- Hive中的数据库在HDFS上的存储路径为:
${hive.metastore.warehouse.dir}/databasename.db
比如,名为lxw1234的数据库存储路径为:
/user/hive/warehouse/lxw1234.db
- 创建Hive数据库
使用HDFS超级用户,进入Hive-Cli,语法为:
- CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
- [COMMENT database_comment]
- [LOCATION hdfs_path]
- [WITH DBPROPERTIES (property_name=property_value, ...)];
比如,创建名为lxw1234的数据库:
- CREATE DATABASE IF NOT EXISTS lxw1234
- COMMENT 'lxw的大数据田地-lxw1234.com'
- localtion 'hdfs://namenode/user/lxw1234/lxw1234.db/';
创建时候可以指定数据库在HDFS上的存储位置。
注意:使用HDFS超级用户创建数据库后,该数据库在HDFS上的存储路径的属主为超级用户,如果该数据库是为某个或者某些用户使用的,则需要修改路径属主,或者在Hive中进行授权。
- 修改数据库
修改数据库属性:
ALTER (DATABASE|SCHEMA) database_name
SET DBPROPERTIES (property_name=property_value, …);
修改数据库属主:
ALTER (DATABASE|SCHEMA) database_name
SET OWNER [USER|ROLE] user_or_role;
- 删除数据库
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name
[RESTRICT|CASCADE];
默认情况下,Hive不允许删除一个里面有表存在的数据库,如果想删除数据库,要么先将数据库中的表全部删除,要么可以使用CASCADE关键字,使用该关键字后,Hive会自己将数据库下的表全部删除。RESTRICT关键字就是默认情况,即如果有表存在,则不允许删除数据库。
3. Hive中的表(Table)
3.1 查看所有的表
进入Hive-Cli,使用use databasename;切换到数据库之后,执行show tables; 即可查看该数据库下所有的表:
- hive> show tables;
- OK
- lxw1
- lxw1234
- table1
- t_site_log
3.2 表的存储路径
默认情况下,表的存储路径为:
${hive.metastore.warehouse.dir}/databasename.db/tablename/
可以使用desc formatted tablename;命令查看表的详细信息,其中包括了存储路径:
Location: hdfs://cdh5/hivedata/warehouse/lxw1234.db/lxw1234
3.3 内部表和外部表
Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
- 内部表和外部表最大的区别
内部表DROP时候会删除HDFS上的数据;
外部表DROP时候不会删除HDFS上的数据;
- 内部表适用场景:
Hive中间表、结果表、一般不需要从外部(如本地文件、HDFS上load数据)的情况。
- 外部表适用场景:
源表,需要定期将外部数据映射到表中。
- 我们的使用场景:
每天将收集到的网站日志定期流入HDFS文本文件,一天一个目录;
在Hive中建立外部表作为源表,通过添加分区的方式,将每天HDFS上的原始日志映射到外部表的天分区中;
在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
3.4 创建表
创建表的语法选项特别多,这里只列出常用的选项。
其他请参见Hive官方文档:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable
以一个例子来说吧:
CREATE EXTERNAL TABLE t_lxw1234 (
id INT,
ip STRING COMMENT ‘访问者IP’,
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT ‘lxw的大数据田地-lxw1234.com’
PARTITIONED BY (day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
STORED AS textfile
LOCATION ‘hdfs://cdh5/tmp/lxw1234/';
- 关键字EXTERNAL:
表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表
- 关键字COMMENT
为表和列添加注释
- 关键字PARTITIONED BY
表示该表为分区表,分区字段为day,类型为string
- 关键字ROW FORMAT DELIMITED
指定表的分隔符,通常后面要与以下关键字连用:
FIELDS TERMINATED BY ‘,’ //指定每行中字段分隔符为逗号
LINES TERMINATED BY ‘\n’ //指定行分隔符
COLLECTION ITEMS TERMINATED BY ‘,’ //指定集合中元素之间的分隔符
MAP KEYS TERMINATED BY ‘:’ //指定数据中Map类型的Key与Value之间的分隔符
举个例子:
create table score(name string, score map<string,int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
COLLECTION ITEMS TERMINATED BY ‘,’
MAP KEYS TERMINATED BY ‘:';
要加载的文本数据为:
biansutao ‘数学':80,’语文':89,’英语':95
jobs ‘语文':60,’数学':80,’英语':99
- 关键字STORED AS
指定表在HDFS上的文件存储格式,可选的文件存储格式有:
TEXTFILE //文本,默认值
SEQUENCEFILE // 二进制序列文件
RCFILE //列式存储格式文件 Hive0.6以后开始支持
ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
PARQUET //列出存储格式文件,Hive0.13以后开始支持
- 关键词LOCATION
指定表在HDFS上的存储位置。
Hive相关文章(持续更新):
hive优化之——控制hive任务中的map数和reduce数
Hive中的数据库(Database)和表(Table)的更多相关文章
- C# 利用mysql.data 在mysql中创建数据库及数据表
C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...
- hive中创建hive-json格式的表及查询
在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...
- hive中关于数据库与表等的基本操作
一:基本用法 1.新建数据库 2.删除数据库 3.删除非空的数据库 4.指定数据库的位置 LOCATION:指定数据库的位置,不会在系统的默认文件下. 5.在指定数据库中新建表(验证在指定的数据库中可 ...
- 039 hive中关于数据库与表等的基本操作
一:基本用法 1.新建数据库 2.删除数据库 3.删除非空的数据库 4.指定数据库的位置 LOCATION:指定数据库的位置,不会在系统的默认文件下. 5.在指定数据库中新建表(验证在指定的数据库中可 ...
- Hive中的数据库、表、数据与HDFS的对应关系
1.hive数据库 我们在hive终端,查看数据库信息,可以看出hive有一个默认的数据库default,而且我们还知道hive数据库对应的是hdfs上面的一个目录,那么默认的数据库default到底 ...
- mysql中对数据库的每个表执行优化的存储过程
说明:此处为<高性能mysql(第二版)>中的示例代码,除了数据库名 其他未经更改.仅供学习及参考 对数据库的每个表执行优化的存储过程 CREATE PROCEDURE `inventor ...
- hive中sql解析出对应表和字段的调查
---恢复内容开始--- .阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持. druid初期的版本中是包含hive的,将以前版本中的hive dialect对 ...
- 关于如果从SQLSERVER中获取 数据库信息 或者 表信息
1.首先呢.要明确一点.SQLSERVER中的系统信息一般都无从table中找到的.通常都在View中找到 这是重点. 2.接着我们打开算起来SQLSERVER,展开你某一数据库.看到类似 3.然后展 ...
- c#获得目标服务器中所有数据库名、表名、列名的实现代码
/// <summary> /// 获得目标服务器所有数据库名 /// </summary> /// <param name="serverName" ...
随机推荐
- 测试自动化:java+selenium3 UI自动化(1) - 环境搭建
1.前言 我大概是在2012年第一次正式接触到自动化测试,那个时候跟随我的团队一起,就当时项目的UI自动化尝试做出了探索. 在我离开那家公司的时候,我们的自动化测试体系仍然难言完美,但是也已经达到了非 ...
- Spring 2017 Assignments1
一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment1/ 翻译:http://www.mooc.ai/course/268/lear ...
- linuxdeploy安装报错
报错内容:checking installation path…fail(检查安装路径) 处理方法:安装在手机自带的存储空间中,则在路径开头加上${ENV_DIR},安装在sdcard中,加上${EX ...
- 详解InheritableThreadLocal类的使用与原理
在Java并发编程中,InheritableThreadLocal 与 ThreadLocal 都可以用于线程间通信,不同的是 InheritableThreadLocal 继承了 ThreadLoc ...
- 使用Tesseract-OCR 做验证码识别浅析
使用工具jTessBoxEditor-0.7(这个是在java平台下开发的,所以 它只支持java平台 ,在使用前应该先配置好java环境) tesseract 程序集(因为该程序集是在.net 2. ...
- react-navigation
安卓端React Navigation的TabNavigator选项卡与react-native-scrollable-tab-view.FlatList一起使用,只显示第一页的内容. 解决方案: 给 ...
- java多线程----悲观锁与乐观锁
java多线程中悲观锁与乐观锁思想 一.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线 ...
- sea.js的同步魔法
前些时间也是想写点关于CMD模块规范的文字,以便帮助自己理解.今天看到一篇知乎回答,算是给了我一点启发. 同步写法却不阻塞? 先上一个sea.js很经典的模块写法: // 定义一个模块 define( ...
- SynchronousQueue队列程序的执行结果分析
public static void main(String[] args) throws Exception { /** * SynchronousQueue队列程序的执行结果分析 * Blocki ...
- Mybatis延迟加载的实现以及使用场景
首先我们先思考一个问题,假设:在一对多中,我们有一个用户,他有100个账户. 问题1:在查询用户的时候,要不要把关联的账户查出来? 问题2:在查询账户的时候,要不要把关联的用户查出来? 解答:在查询用 ...