《Hive编程指南》笔记一

1、hive不支持行级插入操作、更新操作和删除操作。hive不支持事务。


2、用户还可以为数据库增加一些相关的键-值对属性信息,

create database test
with dbproperties('creator'='Mark','date'='2012-01-02');
#通过下面语句查看描述信息
describe database extended test;

test hdfs://master-server/user/hive/warehouse/test.db
{date=2012-01-02,creator=Mark}

3、默认情况下,hive是不允许用户删除一个包含有表的数据库的,用户要么先删除数据库中的表,然后再删除数据库,要么在删除命令的最后加上关键字cascade,这样可以使hive自行删除数据库中的表。
DROP DATABASE IF EXISTS testdatabase CASCADE;


4、alter database命令只能修改某个数据库的dbproperties信息,不能修改数据库名和数据库所在的目录位置。


5、拷贝一张已经存在的表模式

create external table testtable1 like testable;

注意:如果语句中省略external关键字而且原表是外部表的话,那么生成的新表也是外部表。如果语句中省略external关键字二期源表是管理表的话,那么生成的新表也是管理表。但是如果语句中包含eternal关键字而且源表是管理表的话,那么生成的新表僵尸外部表。


6、即使不知用use databasexxx也可以列举出指定数据库中的表:
show tables in mydb;


7、自定义表的存储格式没搞懂。。。。


8、ALTER TABLE

alter table仅仅会修改表的元数据,表数据本身不会有任何修改。需要用户自己确认所有的修改都是和真实的数据是一致的。

  • 表重命名
    ALTER TABLE testtable RENAME TO testtable1;
  • 增加、修改和删除表分区
ALTER TABLE testtable ADD IF NOT EXISTS
PARTITION(year = 2011,month = 1) LOCATION '/log/2011/01'
PARTITION(year = 2011,month = 2) LOCATION '/log/2011/02'
...;
#添加多芬区语句在hive v0.8.0和之后的版本支持,低版本不支持
  • 修改列信息
ALTER TABLE testtable 
CHANGE COLUMN hms hour_minutes_seconds INT
COMMENT 'The hours, minutes, and seconds'
  • 增加列
ALTER TABLE testtable ADD COLUMNS(
col1 STRING,
col2 INT
...
);
  • 修改表属性
ALTER TABLE testtable SET TBLPROPERTIES(
'note' = 'hello world'
);

9、向管理表中装载数据

LOAD DATA LOCAL INPATH '/path/.../'
OVERWRITE INTO TABLE  testtable
PARTITION (country='US');

若指定OVERWRITE关键字,那么目标文件夹中之前存在的数据将会删除。如果没有指定OVERWRITE关键字,而目标文件夹下已经有同名的文件时,会保留之前的文件并且会重命名新文件为“之前的文件名_序列号”。

**注:**hivev0.9.0版本之前的版本中存在bug:如果没有使用overwrite,目标文件夹中已经存在和装载文件同名的文件的话,之前的文件会被覆盖重写。这样数据会丢失。这个bug在0.9.0版本中已经修复了。


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

INSERT OVERWRITE(INTO) TALBE employees
PARTITION(country='US',state='OR')
SELECT * FROM staged_employees se
WHERE se.cnty='US' AND se.st='OR';

说明:
INSERT INTO 是简单的添加数据
INSERT OVERWRITE 是删除原有数据然后再新增数据,如果有分区,那么指定的分区数据将会删除,其他分区不受影响。


11、动态分区属性说明
动态分区功能默认 情况下是没有开启的。开启后,默认是以“严格”模式执行的,在这种模式下要求至少有哦一列分区字段是静态的。这有助于阻止因设计错误导致查询中产生大量的分区。
动态分区属性

属性名称

缺省值

描述

hvie.exec.dynamic.partition

false

设置成true开启动态分区功能

hive.exec.dynamic.partition.mode

strict

设置成nonstrict,表示允许所有分区都是动态的

hive.exec.max.dynamic.partitions.pernode

100

每个mapper或reducer可以创建的最大动态分区个数。如果某个mapper会reducer尝试创建大于这个数的分区的话则会抛出一个致命的错误信息

hive.exec.dynamic.partitions

+1000

一个动态分区创建语句可以创建的最大分区个数。如果超过这个值则会抛出致命错误

hive.exec.max.created.files

100000

全局可以创建的最大文件个数。有一个hadoop计数器会跟踪记录创建了多少个文件,如果超过这个值会抛出致命错误。


12、单个查询语句中创建表并加载数据

CREATE TABLE testtable
AS SELECT name, age, sex 
FROM people;

这个功能不能用于外部表。可以回想使用ALTER TABLE语句可以为外部表“引用”到一个分区,这里本身没有进行数据“装载”,而是将元数据中指定一个指向数据路径。


13、数据导出

两种方式:一种是通过hdfs命令进行数据的导出,另一种是使用INSERT…DIRECTORY…

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/test'
SELECT * FROM testtable;

这种方式下,不过在源表中数据实际是怎么存储的,hive会将所有的字段序列化成字符串写入到文件中。hive使用和hvie内部存储的表相同的编码方式来生成数据文件。


14、表生成函数没看懂。。。。。


15、CASE … WHEN … THEN句式

SELECT name
CASE 
    WHEN salary < 5000 THEN 'low'
    WHEN salary >= 5000 AND salary < 7000 THEN 'middle'
    WHEN salary >= 7000 AND salary < 10000 THEN 'high'
    ELSE 'verry high'
END
AS bracket FROM employees;

16、hql语句中如果含有NULL,那么无论经过什么运算都为空
nvl(columnname,0)将columnname中为空的字段转换为0.