hive SQL基本操做

1.建表api

建立簡單表:oop

hive> CREATE TABLE pokes (foo INT, bar STRING);

建立外部表:測試

CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User',

country STRING COMMENT 'country of origination')

COMMENT 'This is the staging page view table'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'

STORED AS TEXTFILE

LOCATION '<hdfs_location>';

建分區表:url

CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(date STRING, pos STRING)

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY '\n'

STORED AS SEQUENCEFILE;

建Bucket表:code

CREATE TABLE par_table(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(date STRING, pos STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED ‘\t’
   FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;

建立表並建立索引字段ds:orm

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

複製一個空表:排序

CREATE TABLE empty_key_value_store
LIKE key_value_store;

2.hive建表語句:索引

create table page_view  
(  
page_id bigint comment '頁面ID',  
page_name string comment '頁面名稱',  
page_url string comment '頁面URL'  
)  
comment '頁面視圖'  
partitioned by (ds string comment '當前時間,用於分區字段')  
row format delimited  
stored as rcfile  
location '/user/hive/test';

這裏須要說下stored as 關鍵詞,hive目前支持三種方式:

1:就是最普通的textfile,數據不作壓縮,磁盤開銷大,解析開銷也大

2:SquenceFIle,hadoop api提供的一種二進制API方式,其具備使用方便、可分割、可壓縮等特色。

3:rcfile行列存儲結合的方式,它會首先將數據進行分塊,保證同一個record在一個分塊上,避免讀一次記錄須要讀多個塊。其次塊數據列式存儲,便於數據存儲和快速的列存取。

RCFILE因爲採用是的列式存儲,因此加載時候開銷較大,但具備很好的查詢響應、較好的壓縮比。ip

若是創建的表須要加上分區,則語句以下:

這裏partitioned by 表示按什麼字段進行分割,一般來講是按時間hadoop

create table test_ds  
(  
  id int comment '用戶ID',  
  name string comment '用戶名稱'  
)  
comment '測試分區表'  
partitioned by(ds string comment '時間分區字段')  
clustered by(id) sorted by(name) into 32 buckets  
row format delimited   
fields terminated by '\t'  
stored as rcfile;

若是須要對某些字段進行聚類存儲,方便對hive集羣列進行採樣,則應該這樣編寫SQL:

create table test_ds  
(  
  id int comment '用戶ID',  
  name string comment '用戶名稱'  
)  
comment '測試分區表'  
partitioned by(ds string comment '時間分區字段')  
clustered by(id) sorted by(name) into 32 buckets      
row format delimited   
fields terminated by '\t'  
stored as rcfile;

 這裏表示將id按照name進行排序,聚類彙總,而後分區劃分到32個散列桶中。

若是想改變表在hdfs中的位置,則應該使用location字段顯式的指定:

create table test_another_location  
(  
   id int,   
   name string,  
   url string  
)  
comment '測試另一個位置'  
row format delimited  
fields terminated by '\t'  
stored as textfile  
location '/tmp/test_location';

 其中/tmp/test_location可沒必要先建立

3.將外部數據文件導入到hive中

建空表

hive> create table scores(id int, score int)
    > row format delimited
    > fields terminated by ','
    > stored as textfile;
hive> load data local inpath '/home/bruce/study/perl/score.text' overwrite into table scores;

要求:

1. 兩個表的維度必須同樣,纔可以正常寫入

2. 若是查詢出來的數據類型和插入表格對應的列數據類型不一致,將會進行轉換,可是不能保證轉換必定成功,好比若是查詢出來的數據類型爲int,插入表格對應的列類型爲string,能夠經過轉換將int類型轉換爲string類型;可是若是查詢出來的數據類型爲string,插入表格對應的列類型爲int,轉換過程可能出現錯誤,由於字母就不能夠轉換爲int,轉換失敗的數據將會爲NULL。

3. overwrite是刪除原有數據而後在新增數據,若是有分區那麼只會刪除指定分區數據,其餘分區數據不受影響

相關文章
相關標籤/搜索