2013年4月26日 星期五

[hadoop][hive]how to create table in hive

在hive建立一個表 (table )
他只會自在metastore也就是我們的rdb 建立metadata。

create table table_name (
id int,
dtDontQuery string,
name string
);

還可以加上partition 把查找資訊帶在hdfs的資料夾路徑上,
在使用where條件時,hive只會去對該路徑下的file做處理,
可以節省處理其他不必要的檔案。
create table table_name (
id int,
dtDontQuery string,
name string
)
partitioned by (date string);

在hdfs上的路徑會長的像這樣
(hive 使用的root 路徑 定義在 hive.metastore.warehouse.dir
這裡使用 /apps/hive/warehouse/ )

/apps/hive/warehouse/table_name/date=20130426/

這時候我們就開始想把data透過hive載到hdfs上面去歸檔,
在hive中有形式的表存在hdfs中,

第一種,internal table 檔案在hive資料夾的路徑中,
第二種,external table 使用 external table的方式映設到hdfs上的檔案
(當 drop table TABLENAME ; 時,external table只會刪除,在metastore上的表的metadata並不會刪除原本hdfs內的資料。)

對 external table的宣告如下,

create external table if not exists table_name (
id int,
dtDontQuery string,
name string
);
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/tb';

上面這個例子,
我們又多提到了, if not exists 與 ROW FORMAT DELIMITED FIELDS TERMINATED BY
還有 LOCATION。
分別是,可以先判斷你要創建的表是否存在於hive table當中,如果沒有就會幫你建立。
當我們載入的資料來源,每一筆record中,每個field是以 ','作為分隔的話,
就可以使用 DELIMITED FIELDS TERMINATED BY 去 宣告,
這個在hive內預設是 ctrl+A \000。
透過,location 直接映設了存在在hdfs上的檔案。

順道一提,
hive 是屬於 schema on read,也就說,當他在建table, load data時,不會檢查檔案的內容,
所以,在載入資料到hive 路徑下時,只是單純的copy。





沒有留言:

張貼留言