Hive编程指南学习笔记-持续更新

HiveQL 数据定义

HiveQL 是Hive查询语言,不完成遵循任一种ANSI SQL标准的修订版。
Hive 不支持行级插入操作、更新操作和删除操作,也不支持事务

Hive中的数据库

Hive中数据库本质上是表的一个目录或者命名空间,这样可以避免表命名的冲突。
创建数据库 Hive 会为每个数据库创建一个目录,数据库里的表将会以这个数据库目录的子目录的形式存储。

hive> CREATE DATABASE financials;
hive> CREATE DATABASE IF NOT EXISTS financials;

显示数据库如果数据库非常多的话,可以使用正则表达式匹配来筛选出需要的数据库名

hive> SHOW DATABASE LIKE 'h.*'
human_resources
hive>...

数据库所在目录位于属性hive.metastore.warehouse.dir所指定的目录,其中default这个数据库比较特殊,没有相应的目录,所以default的表都是在hive.metastore.warehouse.dir顶层目录,数据库的文件目录名是以.db结尾
用户可以通过如下命令来修改文件存储的这个默认位置

hive> CREATE DATABASE financials 
    > LOCATION '/my/preferred/directory'

hive> CREATE DATABASE financials 
    > COMMENT 'Holds all financials tables'

hive> DESCRIBE DATABASE financials;
   financials Holds all financials tables
hdfs://master-server/user/hive/warehouse/financials.db

在这个例子中URL格式是hdfs, 如果安装的是MapR,那么这里就是maprfs,用户也可以使用亚马逊的S3特定的格式s3n

为了脚本的可移植性,通常会省略掉那个服务器和端口号信息,而只有在涉及到另一个分布式文件系统实例(包括S3存储)的时候才会指明该信息。

hive> CREATE DATABASE financials
    > WITH DBPROPERTIES ('creater' = 'Mark Moneybags','date' = '2012-01-02')

hive> DESCRIBE DATABASE financials;
   financials Holds all financials tables
hdfs://master-server/user/hive/warehouse/financials.db

hive> DESCRIBE DATABASE EXTENDED financials;
hdfs://master-server/user/hive/warehouse/financials.db
(creater=Mark Moneybags,date=2012-01-02)

USE 命令用于将某个数据库设置为用户当前的工作数据库,和在文件系统中切换工作目录是一个概念:

hive> USE financials;
...

可以通过设置一个属性值来在提示符里面显示当前所在的数据库

hive> set hive.cli.print.current.db=true
hive (financials) > USE default
hive (default) > set hive.cli.print.current.db=false
hive> ...

删除数据库,IF EXISTS子句是可选的,如果加了这个子句,就可以避免因数据库financials不存在而抛出警告信息。默认情况下,Hive是不允许用户删除一个包含有表的数据库的,用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加在CASCADE这样可以使Hive自行先删除数据库中的表:

hive> DROP DATABASE IF EXISTS financials;

hive> DROP DATABASE IF EXISTS financials CASCADE;
修改数据库

用户可以使用ALTER DATABASE命令来为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个个数据库的属性信息。数据库的其他元数据信息是不可更改的,包括数据库名数据存储的目录位置

创建表

Hive的CREATE TABLE语句是遵循SQL语法惯例的,同时Hive的这个语句中具有显著的功能扩展,使其可以具有广泛的灵活性。
用户可以在字段类型后为每个字段增加一个注释。和数据库一样,用户也可以为这个表本身添加一个注释,还可以自定义一个或多个表属性。TBLPROPERTIES主要作用是按键-值对的格式为表增加额外的文档说明。
Hive 自动增加两个表属性: 一个是last_modified_by 一个是last_modified_time 分别保存着最后修改这个表的用户名,和最后一次修改的新纪元时间秒。

用户还可以拷贝一张已经存在的表的表模式(而无需拷贝数据,类似表结构)

hive> CREATE TABLE IF NOT EXISTS mydb.employees2 
LIKE mydb.employees;

Hive 并非支持所有的正则表达式功能。如果用户了解正则表达式的话 ,最好事前先测试下备选的正则表达式是否生效。
我们也可以使用DESCRIBE EXTENDED mydb.employees命令来查看这个表的详细表结构信息,
还有一种使用FORMATTED关键字替代EXTENDED关键字的话,可以提供更加可读的和冗长的输出信息。

如果用户只想查看某一列的信息,那么只要在表名后增加这个字段的名称即可,这种情况下, EXTENDED关键字也不会增加更多输出信息。

hive> DESCRIBE mydb.employees.salary;
salary float Employee salary
管理表

我们目前所创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少)控制着数据的生命周期。
但是,管理表不方便和其他工作共享数据,例如: 假设我们有一份由Pig或者其他工具创建并且主要由这一工具使用的数据,同时我们还想Hive在这份数据上执行一些查询,可以并没有给予Hive对数据的所有权,我们可以创建一个外部表指向这份数据,而并不需要对其具有所有权。

外部表

下面语句将创建一个外部表,其可以读取所有位于/data/stocks目录下的以逗号分隔的数据:

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';

关键字EXTERNAL告诉Hive这个表是外部表,而后面的LOCATION…子句则用于告诉Hive数据位于哪个路径下。
因为表是外部表,所以Hive并非认为其完全拥有这份数据。因此,删除该表并不会删掉这份数据,不过描述表的元数据信息会被删掉。

用户可以在DESCRIBE EXTENDED tablename语句的输出中查看到表是否是管理表或者是外部表。在末尾的详细表信息输出中,对于管理表,用户可以看到如下信息:

... tableType:MANAGED_TABLE)

对于外部表,用户可以看到如下信息:

... tableType: EXTERNAL_TABLE)
分区表
    原文作者:JaeGwen
    原文地址: https://www.jianshu.com/p/6b3ac2693c48
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞