1. 程式人生 > >系統學習hive programming,第四章----表和資料庫定義

系統學習hive programming,第四章----表和資料庫定義


/*
*    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.name, 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.name, 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');