hiveql筆記(一)

1、創建表

create table if not exists mydb.employees{

  name  String COMMENT 'Employee name',

  salary  FLOAT COMMENT 'Empolyee salary',

  subordinates APPAY<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 'Desription of the table'

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

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

Hive 會自動添加兩個表屬性:一個是last_modified_by,其保存着最後修改這個表的用戶的用戶名。另一個是last_modified_time,其保存着最後修改的新紀元時間秒。

 

2、查看錶的詳細表結構信息

DESCRIBE EXTENDED mydb.employees;

//在表名後添加字段的名稱,使用extended關鍵字也不會增加更多的輸出信息。

DESCRIBE mydb.employees.salary;

 

3、外部表

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

關鍵字EXTENAL告訴hive這個表是外部的,而後面的LOCATION..子句則用於告訴HIVE數據位於哪個路徑下。

//還可以對一張存在的表進行結構複製(而不會複製數據)

  CREATE EXTERNAL TABLE IF NOT EXISTS mydb.employees3

  LIKE mydb.employees

  LOCATION '/path/to/data';

 

4、分區表、管理表

CREATE TABLE employees (

  name  String,

  salay  FLOAT,

  subordinates  APPAY<STRING>,

  deductions  MAP<STRING,FLOAT>,

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

PARTITIONED BY (country STRING,state STRING);

分區表改變了Hive對數據存儲的組織方式,這個表會有一個exployees目錄與之對應,每個分區都有一個partXX

 

//可以使用show partitions命令查看錶中存在的所有分區:

SHOW PARTITIONS employees; 

//如果表中存在很多的分區,而只想查看是否存儲某個特定分區鍵的分區的話,還可以在命令上添加指定了一個或多個特定分區字段值的PARTITION子句:

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

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

 

5、外部分區表

CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (

  hms  INT,

  severity  STRING,

  server    STRING,

  porcess_id  STRING,

  message  STRING)

PARTITIONED BY (year INT,month INT,day INT)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

//添加一個分區

ALTER TABLE log_messages ADD PARTITION(year = 2012,month = 1,day =2 )

LOCATITION 'hdfs://master_server/data/log_message/2012/01/02';

 

//將一個月前的分區數據拷貝到其他集羣

hadoop distcp /data/log_message/2011/12/02  s3n://ourbucket/logs/2011/12/02

 

//修改表,將分區路徑指向到S3路徑:

ALTER TABLE log_messages PARTITION(year = 2011,month = 12,day = 2)

SET LOCATION 's3m://ourbucket/logs/2011/01/02';

 

//DESCRIBE EXTENDED log_message 語句會將分區鍵作爲表的模式的一部分,和partitionKeys列表的內容同時進行顯示:

DESCRIBE EXTENDED log_messages;

 

6、刪除表

DROP TABLE IF EXISTS employees;

//這裏有個知識點,如果開啓了Hadoop回收站功能(默認是關閉),那麼數據將會轉移到用戶在分佈式文件系統中的用戶跟目錄下的.Trash目錄下,也就是HDFS中的/usr/$USER/.Trash目錄,如果要開啓這個功能,需要配置fs.trash.internal的值。設置一個合理的整數,比如如果設置1440,那麼就表示是24小時。

 

7、表重命名

ALTER TABLE log_messages RENAME TO logmsgs;

 

8、修改列信息

ALTER TABLE log_messages

CHANGE COLUMN hms hours_minutes_seconds INT

COMMENT 'The hours,minutes, and seconds part of the timestamp'

AFTER severity;

//這裏說明,如果想將這個字段移動到第一個位置,需要使用FIRST關鍵字替代AFTER other_column子句即可。

 

9、增加列

 ALTER TABLE log_messages ADD COLUMNS (

  app_name STRING COMMENT 'Application name',

  session_id LONG COMMENT 'The current session id');

 

10、刪除或者替換列

//移除了之前所有的字段並重新指定了新的字段:

ALTER TABLE log_messages REPLACE COLUMNS (

  hours_mins_secs INT COMMENT 'hour,minute,seconds from timestamp',

  serverity STRING COMMENT 'The message severity'

  message STRING COMMENT 'The rest of the message');

 

11、修改存儲屬性

ALTER TABLE log_messages

PARTITION(year = 2012,month = 1,day = 1)

SET FILEFORMAT SEQUENCEFILE;

 

12、通過查詢語句向表中插入數據

INSERT OVERWRITE TABLE employees

PARTITION (country = 'US' , state = 'OR' )

SELECT * FROM staged_employees se

WHERE se.cnty = 'US' AND se.st = 'OR';

//如果是非分區表,之前表中的內容將會被覆蓋掉

 

13、動態分區插入

//指定了country字段的值爲靜態的US,而分區字段state是動態值。

INSERT OVERWRITE TABLE employees

PARTITION (country='US',state)

SELECT ...,se.cnty,se.st

FROM staged_employees se

WHERE se.cnty = 'US';

(靜態分區鍵必須出現在動態分區鍵之前)

//延伸動態分區屬性:

hive.exec.dynamic.partition  false      設置成true,表示開啓動態分區功能

hive.exec.dynamic.partition.mode  strict   設置成strict,表示允許所有分區都是動態的

hive.exec.max.dynamic.parition.pernode  100  每個mapper或reducer可以創建的最大動態分區個數。如果某個mapper或reducer嘗試創建大於這個值得分區的話則會拋出一個致命錯誤信息。

hive.exec.max.dynamic.partitions  +1000  一個動態分區創建語句可以創建的最大動態分區個數。如果超過這個值則會拋出一個致命錯誤信息。

hive.exec.max.created.files  100000  全局可以創建的最大文件個數。

eg:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrct;

set.hive.exec.max.dynamic.partitions.pernode=1000;

INSERT OVERWRITE TABLE employees

PARTITION (country,state)

SELECT ...,se.cty,se.st

FROM staged_employees se;

 

14、單個查詢語句中創建表並加載數據

CREATE TABLE ca_employees

as SELECT name,salary,address

FROM employees

WHERE se.state = 'CA';

 

15、導出數據

hadoop fs -cp sorce_path target_path

//也可以使用INSERT...DIRECTORY...

INSERT OVERWRITE LOCAL DIRECTOR 'tmp/ca_employees'

SELECT name,salary,address

From employees

WHERE se.state = 'CA';

 

參考文獻《Hive編程指南》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章