Hive常用的SQL命令操作
轉自?http://blog.csdn.net/wisgood/article/details/17186599
創建表
hive> CREATE TABLE pokes (foo INT, bar STRING);?
創建表并創建索引字段ds
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);?
顯示所有表
hive> SHOW TABLES;
按正條件(正則表達式)顯示表,
hive> SHOW TABLES '.*s';
表添加一列?
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
添加一列并增加列字段注釋
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
更改表名
hive> ALTER TABLE events RENAME TO 3koobecaf;
刪除列
hive> DROP TABLE pokes;
元數據存儲
將文件中的數據加載到表中
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;?
加載本地數據,同時給定分區信息
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
加載DFS數據 ,同時給定分區信息
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.?
SQL 操作
按先件查詢
hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';
將查詢數據輸出至目錄
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
將查詢結果輸出至本地目錄
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
選擇所有列到本地目錄?
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;?
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
將一個表的統計結果插入另一個表中
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
將多表數據插入到同一表中
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
將文件流直接插入文件
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)?
實際示例
創建一個表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
下載示例數據文件,并解壓縮
wget http://www.grouplens.org/system/files/ml-data.tar__0.gz
tar xvzf ml-data.tar__0.gz
加載數據到表中
LOAD DATA LOCAL INPATH 'ml-data/u.data'
OVERWRITE INTO TABLE u_data;
統計數據總量
SELECT COUNT(1) FROM u_data;
現在做一些復雜的數據分析
創建一個 weekday_mapper.py: 文件,作為數據按周進行分割?
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('\t')
生成數據的周信息
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '\t'.join([userid, movieid, rating, str(weekday)])
使用映射腳本
//創建表,按分割符分割行中的字段值
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
//將python文件加載到系統
add FILE weekday_mapper.py;
將數據按周進行分割
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
SELECT weekday, COUNT(1)
FROM u_data_new
GROUP BY weekday;
————————————————————————————————————————————————————
hive update delete:
關于 hive 的更新和刪除問題,csdn 曾舉辦過活動來專門討論過,
http://10773851.42qu.com/10773869
總結如下:
HIVE是一個數據倉庫系統,這就意味著它可以不支持普通數據庫的CRUD操作。CRUD應該在導入HIVE數據倉庫前完成。
而且鑒于 hdfs 的特點,其并不能高效的支持流式訪問,訪問都是以遍歷整個文件塊的方式。hive 0.7 之后已經支持
索引,但是很弱,尚沒有成熟的線上方案。
關于 hive 的刪除和更新有如下辦法:
一、行級的更新和刪除:通過 hbase 進行。
數據保存在HBase中,Hive從HBase中查詢數據,這個官方提供 hive-hbase-handler 插件支持,通過 thrift hive-service 進行通信
優點:
適用性比較普遍,單行和批量修改都可以使用,并且修改也比較方便;修改也比較快速。
缺點:
(1)查詢的時候,性能較數據保存在HDFS的場景慢一些。
(2)通過 hbase 刪除可能會有延時導致臟數據,因為 habse 刪數據是先邏輯刪除,然后等待下一次 compact 再物理刪除。
(3)這種方式產生的 hive 表將不能再更改表結構,alt table 操作直接拋異常。
(4)尚沒有驗證這種方案在大數據量的場景下的可行性。
二、批量更新和刪除:可以相應的使用 insert as select 的方式來實現。
不更改HIVE的設計,利用HiveQL實現update和delete,雖然效率比較低,但是也可以實現update和delete操作。
delete操作實現:
用select語句篩選出不delete的數據,用這些數據覆蓋原來的表,如我們想刪除score在60分以下的行,可以用:
INSERT OVERWRITE students SELECT students.* from students where score >= 60;
update操作的實現:
將要更新的數據從數據庫中選出放入一個本地臨時的文件中,如要更新60分以下的學生的數據,可以使用:
INSERT OVERRITE LOCAL DIRECTORY "/tmp/students.1" SELECT students.* from students where score < 60;
刪除要更新的數據:
INSERT OVERWRITE students SELECT students.* from students where score >=60;
編輯要更新的數據文件或者將要修改的數據放入數據庫表后再修改,修改結束后載入到表中:LOAD DATA INPATH "/tmp/students.1" INTO TABLE students如果對表進行分區,上述的update和delete速度會快一些。
缺點:
同一個操作掃描了 2 遍 hdfs,還不如 MR 批量更新來得快和簡潔。
總結
以上是生活随笔為你收集整理的Hive常用的SQL命令操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive的Specified key w
- 下一篇: 83款 网络爬虫开源软件