Hive DDL DML SQL操作


工作中經常要用到的一些東西,一直沒整理,用的多的記住了,用的不多的每次都是去查,所以記錄一下。 

DDL(數據定義語言),那就包括建表,修改表結構等等了

建表:create hive table

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

創建一個名為pokes的表,包括兩個字段,第一個字段foo是整型,第二個字段bar是字符串。

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

創建一個名為invites的表,包括兩個字段(列):foo、bar,和一個分區字段(列)ds。分區字段是虛擬的字段(列)。他不屬於數據本身,而是一個特定的數據集。

默認情況下表被按照文本格式存儲,以ctrl+a分隔列。

下面是工作中常用的建表方式(日期表和分區表):

需要解釋的地方:

1  ROW FORMAT DELIMITED
2    FIELDS TERMINATED BY '\001'
3    COLLECTION ITEMS TERMINATED BY '\002'
4    MAP KEYS TERMINATED BY '\003'
5  STORED AS TEXTFILE;

[ROW FORMAT DELIMITED]關鍵字,是用來設置創建的表在加載數據的時候,支持的列分隔符。不同列之間用一個'\001'分割,集合(例如array,map)的元素之間以'\002'隔開,map中key和value用'\003'分割。

stored as textfile表示按文本存儲數據文件

瀏覽表:browsing through table

1 hive> SHOW TABLES;

列出所有的表

1 hive> SHOW TABLES '.*s';

列出所有以‘s’結尾的表(正則模式使用Java的規則)

1 hive> DESCRIBE invites;

列出表中的字段信息

變更和刪除表:altering and dropping tables

可以變更表名,或者增加和刪除列等:

1   hive> ALTER TABLE events RENAME TO 3koobecaf;
2   hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
3   hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
4   hive> ALTER TABLE invites REPLACE COLUMNS (foo INT, bar STRING, baz INT COMMENT 'baz replaces new_col2');

注意:REPLACE COLUMNS替換所有的列,但是數據不會變更。這個功能可以用於刪除表中的某些列,如:

1 ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');

替換后僅留下了第一列和分區列

1 hive> DROP TABLE pokes;

刪除表

 

DML(數據處理語言)包括數據載入導出等

從本地文件加載到表

1 hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

OVERWRITE表示覆蓋表中數據,如果沒有使用OVERWRITE將把數據追加到表中原有數據后面

載入文件中的內容必須按照正確地分隔符分割列,load data並不會進行數據驗證

1 hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
2 hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');

上面給兩條語句將數據載入到不同的分區

1 hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上面的命令從HDFS中加載文件。從HDFS中加載文件將移動文件

 

SQL(結構化查詢語言)用於查詢數據

查詢

1 hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

從invites表的2008-08-15分區中查詢出foo字段

1 hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

查詢invites表的2008-08-15分區的所有字段內容並將查詢結果導入到hdfs的/tmp/hdfs_out文件中

1 hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

將查詢結果保存到本地文件

1   hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
2   hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
3   hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
4   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
5   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';
6   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
7   hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

一些查詢示例

GROUP BY使用

1 hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;
2 hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

(上面的兩條語句是等價的)

JOIN

1 hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

join使用時要注意方式的選擇({LEFT|RIGHT|FULL} [OUTERJOIN)及優化,下面是一些參考

http://yugouai.iteye.com/blog/1849395

http://www.open-open.com/lib/view/open1341214750402.html

多表插入(MULTITABLE INSERT

1   FROM src
2   INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
3   INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
4   INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
5   INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

上面的語句含義是從src表中查詢出各表需要的數據插入到不同的表中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM