您好,登錄后才能下訂單哦!
這篇文章主要介紹了Hive怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
#簡介#
Apache 頂級項目Hive數據倉庫軟件便于查詢和管理駐留在分布式存儲上的大型數據集.他提供了:
能夠進行簡單的數據提取/轉換/加載(ETL)的工具
一種使各種各樣的數據格式結構化的機制
訪問直接存儲在Apache HDFS上的文件或者其他數據存儲系統上的文件例如的Apache HBase
通過MapReduce執行查詢
Hive定義了一種簡單的類似SQL的語言,叫做QL。它使熟悉SQL語句的用戶可以查詢數據。同時,這種語言也可以使熟悉MapReduce框架的編程人員通過插入他們自定義的map和reduce來執行更加復雜的這種語言內置功能不支持的復雜分析。QL也可以使用自定義的標量函數(UDF's),聚合函數(UDAF's)和表函數(UDTF's)擴展。
Hive并不強制數據讀寫使用“Hive format"--沒有這樣的事。Hive在Thrift上工作的同樣很好,控制分離,或者你的特殊的數據格式。Please see File Formats and Hive SerDe in the Developer Guide for details.
Hive的設計不適合OLTP,也沒有提供實時的查詢和row級別的更新。它最擅長用于大型僅追加的數據集(就像web日志)的批量job。Hive最看重的是他的伸縮性(使用更多的及其動態的添加到Hadoop集群進行擴展),可擴展性(使用MapReduce框架和UDF/UDAF/UDTF),容錯性,和對于他的輸入格式的低耦合行。
Hive的組建包括HCatalog和WebHCat,HCatalog是Hive的一個組件。它是Hadoop的一個表和存儲管理層,是用戶能夠使用不同的數據處理工具,包括Pig和MapReduce,來更加方便的在Grid上讀寫數據。
WebHCat提供一個服務,你可以使用它運行Hadoop MapReduce(或者YARN),Pig,Hive job,或者使用HTTP(RESTFul風格)接口執行Hive元數據操作。
#安裝和配置# 你可以通過下載壓縮包安裝Hive的穩定版本,或者你可以下載Hive的源代碼并從中構建Hive。
##必要條件##
Java 1.6
Hadoop 0.20.x, 0.23.x, or 2.0.x-alpha
##從一個穩定的版本安裝Hive## 首先從Apache的下載鏡像下載Hive最新的穩定版本。
接下倆你需要解壓壓縮包,浙江創建一個命名為hive-x.y.z(x.y.z是穩定版版本)的子目錄。
tar -xzvf hive-x.y.z.tar.gz
設置環境變量HIVE_HOME 指向這個安裝目錄。
cd hive-x.y.z export HIVE_HOME={{pwd}}
最后,添加$HIVE_HOME/bin到你的PATH
export $PATH:$HIVE_HOME/bin
##運行Hive## Hive使用Hadoop,所以:
你需要添加Hadoop到你的PATH,或者
export HADOOP_HOME=<hadoop-install-dir>
此外,在你zaiHive中創建一個表之前,你必須在HDFS中創建/tmp和/user/hive/warehouse并且設置它們chmod g+w。
進行此設置的命令:
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
你將會發現設置HIVE_HOME是有用的,雖然他不是必需的。
$ export HIVE_HOME=<hive-install-dir>
在shell下使用Hive的命令行接口(CLI):
$ $HIVE_HOME/bin/hive
#DDL操作# Hive的DDL操作都記錄在 Hive Data Definition Language.
###創建Hive表###
CRATE TABLE pokes (foo INT,bar STRING);
創建一個擁有兩列的叫做pokes的表,第一列是一個integer,第二列是一個String。
CREATE TABLE invites(foo INT ,bar STRING) PARTITIONED BY (ds STRING);
創建一個表invites,它有兩列和一個叫做ds的分區列。分區列是一個虛擬的列。它不是數據自身的一部分,而是來自一個特殊的數據集被加載到分區。
默認情況下,表設定輸入格式為text,分隔符假定為^A(ctrl-a).
###瀏覽表###
SHOW TABLES;
列出所有表。
SHOW TABLES '.*S';
列出所有以s結尾的表。這里的匹配模式遵循JAVA正則表達式。查看這個鏈接的文檔:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html.
DESCRIBE invites;
顯示表的列的列表。
###修改和刪除表### 表名可以被改變,列可以添加或者替換。
hive> ALTER TABLE events RENAME TO 3koobecaf; hive> ALTER TABLE pokes ADD COLUMNS (new_col INT); hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment'); hive> ALTER TABLE invites REPLACE COLUMNS (foo INT, bar STRING, baz INT COMMENT 'baz replaces new_col2');
注意REPLACE COLUMNS 替換所有已存在的列并且只改變表結構,不改變表數據。表必須使用本地的SerDe。REPLACE COLUMNS也可以用于從表結構中刪除列。
hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');
刪除表
hive> DROP TABLE pokes;
###元數據存儲### 元數據存儲在一個遷入的Derby數據庫中,它的磁盤位置取決于Hive配置文件中的變量: javax.jdo.option.ConnectionURL.默認情況下,這個位置是./metastore_db(看conf/hive-default.xml)
現在,在默認配置下,元數據只能在某一時刻被某一用戶訪問。
元數據可以存儲在任何支持JPOX的數據庫中。
#DML 操作# Hive DML 操作文檔在 Hive Data Manipulation Language.
從平面文件加載數據到Hive:
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
加載一個包含兩個列的使用ctrl-a分割的文件到表pokes。'LOCAL'標志著這里的輸入文件在本地文件系統上,如果“LOCAL‘缺省將會在HDFS上尋找文件。
關鍵字'OVERWRITE'標志著這個表中已存在的數據會被刪除。如果“OVERWRITE”缺省,數據文件將會追加到已存在的數據集。
注意:
NO verification of data against the schema is performed by the load command.
If the file is in hdfs, it is moved into the Hive-controlled file system namespace. The root of the Hive directory is specified by the option hive.metastore.warehouse.dir in hive-default.xml. We advise users to create this directory before trying to create tables via Hive.
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15'); hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
上面的兩個加載語句加載數據到表invites的兩個不同的分區。表invites必須在創建時使用key ds分區,是這個操作能夠成功。
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
上面的命令將加載HDFS file/directory 上的數據到表中。
注意從HDFS上加載數據將導致移動 file/directory。作為結果,這個操作幾乎時瞬時的。
#SQL 操作# Hive查詢操作文檔記錄在Select.
##查詢示例## 下面是一些查詢的展示,他們可以在build/dist/examples/queries找到。
更多的例子可以在Hive源碼的ql/src/test/queries/positive找到。
##SELECT 和FILTERS##
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
查詢表invites中分區ds=2008-08-15列名為foo的所有行。查詢結果并不存儲在任何地方,只是顯示在控制臺上。
注意下面所有的例子中,INSERT(到一個Hive表,本地目錄,HDFS目錄)是可選的。
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
查詢invites表中分區ds=2008-08-15的所有行存儲到一個HDFS目錄。查詢結果存儲在這個目錄下的文件(依賴于mapper的數量)中。
注意:partition columns if any are selected by the use of *. They can also be specified in the projection clauses. Partitioned tables must always have a partition selected in the WHERE clause of the statement.
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
查詢表pokes中的所有行存到一個本地目錄。
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(*) FROM invites a WHERE a.ds='2008-08-15'; 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,不包括在HIVE-287中的,你需要使用COUNT(1)替換COUNT(*)。
##GROUP BY##
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar; ive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
注意舊版本的Hive,不包括在HIVE-287中的,你需要使用COUNT(1)替換COUNT(*)。
##JOIN##
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
##MULTITABLE INSERT##
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;
##STREAMING##
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';
這個通過腳本/bin/cat(類似Hadoop streaming)在map階段流失化數據。
類似的——流可以在reduce時使用(查看Hive Tutorial例子)。
#簡單的使用案例#
##MovieLens 用戶評分## 首先,創建一個制表符分割的文本文件格式的表格。
CREATE TABLE u_data ( userid INT, movieid INT, rating INT, unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
然后,在GroupLens datasets頁面(其中也有一個README.txt文件和未解壓文件的索引)從MovieLens 100k下載數據文件。
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
或者:
curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip
注意:如果這個鏈接GroupLens datasets不可用,請在[HIVE-5341]報告這個問題,或者發送一個消息給user@hive.apache.org 郵件組.
解壓這個數據文件:
unzip ml-100k.zip
加載數據u.data到剛才創建的表中:
LOAD DATA LOCAL INPATH '<path>/u.data' OVERWRITE INTO TABLE u_data;
計算表u_data的行數:
SELECT COUNT(*) FROM u_data;
注意舊版本的Hive,不包括HIVE-287,你需要使用COUNT(1)替換COUNT(*)。
現在我們可以在表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(floa(unixtime)).isoweekday() print '\t'.join([userid, movieid, rating, str(weekday)])
使用這個mapper腳本:
CREATE TABLE u_data_new ( userid INT, movieid INT, rating INT, weekday INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 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(*) FROM u_data_new GROUP BY weekday;
注意如果你使用Hive0.5.0或者之前的版本,你需要使用COUNT(1)替換COUNT(*)。
##Apache Weblog 數據## Apache weblog的格式是可以定制的。但是大多數web管理員都使用默認的(配置)。
對于默認的Apache weblog,我們可以通過下面的命令創建一個表。
更多關于RegexSerDe的信息可以在HIVE-662 和HIVE-1719 找到。
CREATE TABLE apachelog ( host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?" ) STORED AS TEXTFILE;
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Hive怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。