/* 

 *    Lee 2013.11.12翻译  《programming hive》 第四章节 Getting Started   @page表示 翻译原文页码 

 */ 

 @page 49 

   Hive 提供一种名为HSQL的方言, 不参考 ASCII SQL标准。 Hive不支持行级修改,故而在HSQL中没有 

 insert , update,delete关键字。 总体来看HSQL和MySQL较为接近。 


                     #Hive中数据库 

   Hive中的数据库是一个逻辑概念,一个命名空间或者目录。为了防止同名表命名冲突。 

 最简单的创建数据库 示例: 

 hive> CREATE DATABASE financials; 

 如果数据库financials已经存在,则Hive抛出一个异常。 

 查看数据库: 

 hive> SHOW DATABASES; 

 default 

 financials 

 hive> CREATE DATABASE human_resources; 

 hive> SHOW DATABASES; 

 default 

 financials 

 human_resources 


 如果Hive中数据库非常多,可以使用正则表达式检索,例如: 

 hive> SHOW DATABASES LIKE 'h.*'; 

 human_resources 

 hive> ... 


 数据库中的表存在于和数据库同名的目录中。Hive中有一个默认数据库default,他没有目录,default中的 

 表直接存在Hive数据目录中,该目录由hive.metastore.warehouse.dir 参数指定。 

 你也可以自定义 数据库存储路径如下: 

 hive> CREATE DATABASE financials 

         > LOCATION '/my/preferred/directory'; 

          

 使用DESCRIBE DATABASE <database>命名给数据库添加注释。 

 hive> CREATE DATABASE financials 

         > COMMENT 'Holds all financial tables'; 

 使用DESCRIBE DATABASE <database>查看数据库注释和存储路径。         

         hive> DESCRIBE DATABASE financials; 

         financials Holds all financial tables 

             hdfs://master-server/user/hive/warehouse/financials.db 


 为数据库添加键值对作为参数 

 hive> CREATE DATABASE financials 

         > WITH DBPROPERTIES ('creator' = 'Mark Moneybags', 'date' = '2012-01-02'); 

 使用 DESCRIBE DATABASE EXTENDED <database>查看数据参数         

 hive> DESCRIBE DATABASE financials; 

             financials hdfs://master-server/user/hive/warehouse/financials.db 


 hive> DESCRIBE DATABASE EXTENDED financials; 

         financials hdfs://master-server/user/hive/warehouse/financials.db 

 {date=2012-01-02, creator=Mark Moneybags); 




 @page52 



 使用USE命令选择当前操作的数据(默认为default) 

 hive> USE financials; 

 现在,你可以用 SHOW TABLES命名列出数据库中的表。目前Hive不提供命令查看你当前所操作的数据库。 

 安全起见,操作前使用USE <database> 非常必要。 


 删除数据库: 

 hive> DROP DATABASE IF EXISTS financials; 

 当数据中存在表时,需要加CASCADE才能删除。一旦删除成功,数据库在HDFS中的文件夹也被删除。 

 hive> DROP DATABASE IF EXISTS financials CASCADE; 


 修改数据库参数: 

  hive> ALTER DATABASE financials SET DBPROPERTIES ('edited-by' = 'Joe Dba'); 

   

 创建数据库示例: 

 CREATE TABLE IF NOT EXISTS mydb.employees ( 

     name STRING COMMENT 'Employee name', 

     salary FLOAT COMMENT 'Employee salary', 

     subordinates ARRAY<STRING> COMMENT 'Names of subordinates', 

     deductions MAP<STRING, FLOAT> 

     COMMENT 'Keys are deductions names, values are percentages', 

     address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> 

     COMMENT 'Home address') 

 COMMENT 'Description of the table' 

 TBLPROPERTIES ('creator'='me', 'created_at'='2012-01-02 10:00:00', ...) 

 LOCATION '/user/hive/warehouse/mydb.db/employees'; 


 IF NOT EXISTS关键字,当同名数据库存在时,Hive忽略这条创建语句,但如果创建的表和同名表结构不同, 

 Hive将给出一个警告。 

 和数据库的创建一样,创建表同时可以赋予表参数,这些参数的作用会在后面章节解释。 




 @page 54 


 表自动维护两个表变量, last_modified_by最后操作数据用户,last_modified_time最后操作时间。 


 可以通过拷贝表结构建立表(复制表结构) 

 CREATE TABLE IF NOT EXISTS mydb.employees2 

     LIKE mydb.employees; 

      

 查看当前数据库下的表: 

 hive> SHOW TABLES; 

 employees 

 table1 

 table2 

 查看其他数据下的表: 

 hive> SHOW TABLES IN otherdb; 

 employees 


 如果有数据库中表非常多,可以使用正则表达式 

 hive> SHOW TABLES 'empl.*'; 

 employees 


 是用 DESC <table> 查看表,示例: 

 hive> DESCRIBE EXTENDED mydb.employees; 

 name string Employee name 

 salary float Employee salary 

 subordinates array<string> Names of subordinates 

 deductions map<string,float> Keys are deductions names, values are percentages 

 address struct<street:string,city:string,state:string,zip:int> Home address 

 Detailed Table Information Table(tableName:employees, dbName:mydb, owner:me, 

 ... 

 location:hdfs://master-server/user/hive/warehouse/mydb.db/employees, 

 parameters:{creator=me, created_at='2012-01-02 10:00:00', 

 last_modified_user=me, last_modified_time=1337544510, 

 comment:Description of the table, ...}, ...) 

 其中EXTENDED 关键字可选 


 @page 56 


 目前我们所讨论的表,称之为“内部表”或者“被管理表”。这个类型的表是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'; 


 使用EXTERNAL关键字标注这个表是外部的。 即使在Hive中drop表, 也只会删除metadata; 




 @page 58 



 #表分区 

 不用于Oracle, Hive分区是一个逻辑概念。以人力资源应用为例子,如果一个大型跨公司需要按照州(省) 

 查询。需要扫描所有的州或者省。一个国家几十个州(省),可能会有上千个分支。 

 Hive分区给出一个层次解决方案————分区。 

 CREATE TABLE employees ( 

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


 对于用户,分区和字段没有区别。用一下语句查询: 

 SELECT * FROM employees 

 WHERE country = 'US' AND state = 'IL'; 


 Hive在表目录下建立分区目录,目录名和分区名一致。因此Hive表中不一定要存在分区字段。 


 设置set hive.mapred.mode=strict;可以强制查询必须使用where关键字。改属性默认为nonstrict 


 hive> set hive.mapred.mode=strict; 

 hive> SELECT , e.salary FROM employees e LIMIT 100; 

 FAILED: Error in semantic analysis: No partition predicate found for 

 Alias "e" Table "employees" 

 hive> set hive.mapred.mode=nonstrict; 

 hive> SELECT , e.salary FROM employees e LIMIT 100; 

 John Doe 100000.0 

 ... 


 使用SHOW PARTITIONS查看表分区情况 

 hive> SHOW PARTITIONS employees; 

 ... 

 Country=CA/state=AB 

 country=CA/state=BC 

 ... 

 country=US/state=AL 

 country=US/state=AK 


 查看分区下的分区 

 hive> SHOW PARTITIONS employees PARTITION(country='US'); 

 country=US/state=AL 

 country=US/state=AK 

 ... 

 hive> SHOW PARTITIONS employees PARTITION(country='US', state='AK'); 

 country=US/state=AK 



 @page 63 




 #表数据存储格式 


 在前面的章节中,我们提到Hive默认使用TEXTFILE作为表数据格式。 

 使用SEQUENCEFILE 和 RCFILE格式可以压缩数据,提高IO效率。也可以自定义存储格式。 


 #删除表 

 DROP TABLE IF EXISTS employees; 

 使用 IF EXISTS,当表不存在时会报错。 


 表改名: 

 ALTER TABLE log_messages RENAME TO logmsgs; 



 添加字段 

 ALTER TABLE log_messages ADD COLUMNS ( 

 app_name STRING COMMENT 'Application name', 

 session_id LONG COMMENT 'The current session id');