Hive数据定义
大约 3 分钟
一、Hive 与 Mysql不同
Hive不支持行级插入操作、更新操作和删除操作,
Hive不支持事务。
二、Hive中的数据库
Hive 中数据库的概念本质上仅仅是表的一个目录或者命名空间。
// 1、数据库目录为:
hive.metastore.warehouse.dir
// 2、创建数据库 :
CREATE DATABASE financials;
// 3、已经存在则:
CREATE DATABASE IF NOT EXISTS financials;
// 4、查看数据库:
SHOW DATABASES; SHOW DATABASES LIKE 'f.*';
// 5、修改默数据库位置:
CREATE DATABASE financials LOCATION '/my/preferred/directory';
// 6、切换工作数据库:
USE financials;
(Hive v0.8.0,可以修改当前工作数据库为默认数据库,set hive.cli.print.current.db=true;)
// 7、删除数据库:
DROP DATABASE IF EXISTS financials;
// 8、级联删除数据库(含表):
DROP DATABASE IF EXISTS financials CASCADE;
// 9、可以使用 ALTER DATABASE 为数据库的 DBPROPERTIES 设置键-值对属性值,来描述数据库的属性信息,其他不可以更改:
ALTER DATABASES financials SET DBPROPERTIES('edited-by' = 'Joe Dba')
// 10、删除表
DROP TABLE IF EXISTS employees;
// 11、表重命名
ALTER TABLE log_messages RENAME TO logmsgs;
// 12、 对某个字段重命名,并修改位置、类型或者注释
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'The hours, minutes, and seconds part of the timestamp'
AFTER severity;
// 13、增加列
ALTER TABLE log_messages ADD COLUMNS(
app_name STRING COMMENT 'Application name',
session_id LONG COMMENT 'The current session id'
);
// 14、删除或者替换列
ALTER TABLE log_messages REPLACE COLUMNS(
hours_mins_secs INT COMMENT 'hour, minute, seconds from timestamp',
severity STRING COMMENT 'The message severity'
message STRING COMMENT 'The rest of the message'
);
// 15、修改表属性
ALTER TABLE log_messages SET TBLPROPERTIES(
'notes' = 'The process id is no longer captured; this column is always NULL'
);
// 16、修改存储属性
ALTER TABLE log_messages PARTITION(year = 2012, month = 1, day =1) SET FILEFORMAT SEQUENCEFILE;
三、分区表、管理表
数据分区:通常使用分区来水平分散压力,将数据从物理上转移到和使用最频繁的用户更近的地方,以及实现其他目的。
先按照 国家 , 后按照 州 分区
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
adress STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING)
分区表改变了 Hive 对数据存储的组织方式。
对比:
(1)如果我们是在mydb数据库中创建的这个表,那么对于这个表只会有一个employees目录与之对应:
hdfs://master_server/user/hive/warehouse/mydb.db/employees
(2)但是,Hive 现在将会创建好可以反映分区结构的子目录。如:
...
.../employees/country=CA/state=AB
.../employees/country=CA/state=BC
...
.../employees/country=US/state=AL
.../employees/country=US/state=AK
...
当我们查询美国伊利诺斯州所有雇员:
SELECT * FROM employees WHERE country = 'US' AND state = 'IL';
更快,所以分区显著的提高查询性能。
但是如果全查询数据非常大,会执行巨大的 MapReduce 任务。
建议将Hive设置为 “strict(严格)” 模式,如果没有WHERE过滤的话,会禁止提交这个任务:
set hive.mapred.mode=strict
// SHOW PARTITIONS命令查看表中存在的所有分区:
SHOW PARTITION employees;
// 查看指定分区
SHOW PARTITIONS employees PARTITION(country='US')
SHOW PARTITIONS employees PARTITION(country='US', state='AK')
// 日志文件
ALTER TABLE log_messages ADD PARTITION(year = 2012,month = 1,day = 2)
LOCATION 'hdfs://master_server/data/log_message/2012/01/02';