https://cwiki.apache.org/confluence/display/Hive/GettingStarted
安裝和配置
您可以通過(guò)下載tarball來(lái)安裝Hive的穩(wěn)定版本,或者下載源代碼來(lái)構(gòu)建Hive。
運(yùn)行HiveServer2和 Beeline
要求
- Java 1.7
注意: Hive版本 1.2 以后需要Java 1.7或更新版本。Hive版本0.14到1.1也適用于Java 1.6。強(qiáng)烈建議用戶開(kāi)始使用Java 1.8(請(qǐng)參閱 HIVE-8607)。 - Hadoop 2.x(首選),1.x(不支持Hive 2.0.0以上版本)。
Hive版本0.13也支持Hadoop 0.20.x,0.23.x. - Hive常用于生產(chǎn)Linux和Windows環(huán)境。Mac是一個(gè)常用的開(kāi)發(fā)環(huán)境。本文檔中的說(shuō)明適用于Linux和Mac。在Windows上使用它需要稍微不同的步驟。
安裝穩(wěn)定版本
首先從其中一個(gè)Apache下載鏡像下載最新的Hive穩(wěn)定版本(請(qǐng)參閱Hive發(fā)行版)。
接下來(lái),你需要解壓tarball。這會(huì)創(chuàng)建一個(gè)名為hive-x.y.z
(其中x.y.z
是版本號(hào))的子目錄:
$ tar -xzvf hive-x.y.z.tar.gz
將環(huán)境變量設(shè)置HIVE_HOME
為指向安裝目錄:
$ cd hive-x.y.z
$ export HIVE_HOME={{pwd}}
最后,添加$HIVE_HOME/bin
到您的PATH
:
$ export PATH=$HIVE_HOME/bin:$PATH
從源代碼構(gòu)建Hive
最新Hive代碼的GIT存儲(chǔ)庫(kù)位置:git clone [https://git-wip-us.apache.org/repos/asf/hive.git](https://git-wip-us.apache.org/repos/asf/hive.git)
( 主分支)。
所有發(fā)布版本都位于名為“branch-0.#”或“branch-1.#”或即將推出的“branch-2.#”的分支中,但版本0.8.1在“branch-0.8-r2 ”。任何具有其他名稱的分支都是正在進(jìn)行中的功能分支。有關(guān) 詳細(xì)信息,請(qǐng)參閱 了解Hive分支。
從0.13開(kāi)始,Hive使用Apache Maven構(gòu)建。
在master上編譯Hive
要從主分支構(gòu)建當(dāng)前的Hive代碼,請(qǐng)執(zhí)行以下操作:
$ git clone https://git-wip-us.apache.org/repos/asf/hive.git
$ cd hive
$ mvn clean package -Pdist
$ cd packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin
$ ls
LICENSE
NOTICE
README.txt
RELEASE_NOTES.txt
bin/ (all the shell scripts)
lib/ (required jar files)
conf/ (configuration files)
examples/ (sample input and query files)
hcatalog / (hcatalog installation)
scripts / (upgrade scripts for hive-metastore)
這里{version} 指的是當(dāng)前的Hive版本。
如果使用Maven(mvn)構(gòu)建Hive源代碼,對(duì)于文中其他部分,我們將"/packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin"目錄作為 <install-dir>。
在分支上編譯Hive
參考: https://cwiki.apache.org/confluence/display/Hive/GettingStarted
運(yùn)行Hive
Hive使用Hadoop,因此:
- 您必須在您的路徑中安裝Hadoop
export HADOOP_HOME=<hadoop-install-dir>
另外, 在Hive中創(chuàng)建表之前,您必須使用以下HDFS命令來(lái)創(chuàng)建/tmp
并/user/hive/warehouse
(hive.metastore.warehouse.dir
設(shè)置)并設(shè)置它們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
您可能會(huì)發(fā)現(xiàn)它很有用,盡管沒(méi)有必要設(shè)置HIVE_HOME
:
$ export HIVE_HOME=<hive-install-dir>
運(yùn)行Hive CLI
要從shell中使用Hive 命令行界面(CLI),請(qǐng)執(zhí)行以下操作:
$ $HIVE_HOME/bin/hive
運(yùn)行HiveServer2和Beeline
從Hive 2.1開(kāi)始,我們需要運(yùn)行下面的schematool命令作為初始化步驟。例如,我們可以使用“derby”作為db類型。
$ $HIVE_HOME/bin/schematool -dbType <db type> -initSchema
HiveServer2(在Hive 0.11中引入)有自己CLI的稱為Beeline 。由于HiveCLI缺乏HiveServer2的多用戶,安全性和其他功能,現(xiàn)在不推薦使用HiveCLI來(lái)支持Beeline。從shell運(yùn)行HiveServer2和Beeline:
$ $HIVE_HOME/bin/hiveserver2
$ $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT
Beeline從HiveServer2的JDBC URL啟動(dòng),這取決于HiveServer2啟動(dòng)的地址和端口。默認(rèn)情況下,它將是(localhost:10000),所以地址將看起來(lái)像jdbc:hive2://localhost:10000。
或者為了測(cè)試目的在同一進(jìn)程中啟動(dòng)Beeline和HiveServer2,為HiveCLI提供類似的用戶體驗(yàn):
$ $HIVE_HOME/bin/beeline -u jdbc:hive2://
運(yùn)行HCatalog
要在Hive 0.11.0及更高版本的shell中運(yùn)行HCatalog服務(wù)器,請(qǐng)執(zhí)行以下操作:
$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh
要在Hive發(fā)行版0.11.0和更高版本中使用HCatalog命令行界面(CLI):
$ $HIVE_HOME/hcatalog/bin/hcat
有關(guān)更多信息,請(qǐng)參閱HCatalog手冊(cè)中的從Tarball 安裝 HCatalog 和HCatalog CLI
運(yùn)行WebHCat(Templeton)
要從Hive發(fā)行版0.11.0和更高版本中的shell運(yùn)行WebHCat服務(wù)器,請(qǐng)執(zhí)行以下操作:
$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh
有關(guān)更多信息,請(qǐng)參閱WebHCat手冊(cè)中的WebHCat 安裝。
配置管理概述
Hive默認(rèn)配置
<install-dir>/conf/hive-default.xml
Hive配置目錄的位置可以通過(guò)設(shè)置
HIVE_CONF_DIR
環(huán)境變量來(lái)更改。配置變量可以通過(guò)(重新)定義來(lái)改變
<install-dir>/conf/hive-site.xml
Log4j配置存儲(chǔ)在
<install-dir>/conf/hive-log4j.properties
Hive配置是Hadoop之上的重疊 - 它默認(rèn)繼承Hadoop配置變量。
-
Hive配置可以通過(guò)以下操作來(lái)控制:
- 編輯hive-site.xml并在其中定義任何需要的變量(包括Hadoop變量)
- 使用set命令(請(qǐng)參閱下一節(jié))
- 使用以下語(yǔ)法調(diào)用Hive(不建議使用),Beeline或HiveServer2:
$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //this sets the variables x1 and x2 to y1 and y2 respectively
$ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2 //this sets server-side variables x1 and x2 to y1 and y2 respectively
$ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2 //this sets client-side variables x1 and x2 to y1 and y2 respectively.
* 將`HIVE_OPTS`環(huán)境變量設(shè)置為“ `--hiveconf x1=y1 --hiveconf x2=y2`”,其與上述相同。
運(yùn)行時(shí)配置
Hive查詢是使用map-reduce查詢執(zhí)行的,因此查詢的行為可以通過(guò)Hadoop配置變量來(lái)控制。
HiveCLI(不建議使用)和Beeline命令'SET'可用于設(shè)置任何Hadoop(或Hive)配置變量。例如:
beeline> SET mapred.job.tracker=myhost.mycompany.com:50030;
beeline> SET -v;
后者顯示所有當(dāng)前設(shè)置。沒(méi)有-v
選項(xiàng),只顯示與基礎(chǔ)Hadoop配置不同的變量。
Hive,Map-Reduce和Local-Mode
Hive編譯器為大多數(shù)查詢生成map-reduce作業(yè)。這些作業(yè)然后被提交給由變量指示的Map-Reduce集群:
mapred.job.tracker
雖然這通常指向具有多個(gè)節(jié)點(diǎn)的map-reduce集群,但Hadoop也提供了一個(gè)選項(xiàng),可在用戶的工作站上本地運(yùn)行map-reduce作業(yè)。這對(duì)于在小數(shù)據(jù)集上運(yùn)行查詢可能非常有用 - 在這種情況下,本地模式執(zhí)行通常比將作業(yè)提交到大型集群要快得多。 相反,本地模式只能用一個(gè)reducer運(yùn)行,并且可能會(huì)非常緩慢地處理較大的數(shù)據(jù)集。
從0.7版開(kāi)始,Hive完全支持本地模式執(zhí)行。要啟用此功能,用戶可以啟用以下選項(xiàng):
hive> SET mapreduce.framework.name=local;
另外,mapred.local.dir
應(yīng)該指向在本地機(jī)器上有效的路徑(例如/tmp/<username>/mapred/local
)。(否則,用戶將得到分配本地磁盤(pán)空間的例外。)
從0.7版開(kāi)始,Hive還支持一種模式,可以自動(dòng)在本地模式下運(yùn)行map-reduce作業(yè)。相關(guān)的選項(xiàng)有hive.exec.mode.local.auto
,hive.exec.mode.local.auto.inputbytes.max
和hive.exec.mode.local.auto.tasks.max
:
hive> SET hive.exec.mode.local.auto=false;
請(qǐng)注意,此功能默認(rèn)處于禁用狀態(tài)。如果啟用,Hive會(huì)分析查詢中每個(gè)map-reduce作業(yè)的大小,并且如果滿足以下閾值,則可以在本地運(yùn)行它:
- 作業(yè)的總輸入大小低于:(
hive.exec.mode.local.auto.inputbytes.max
默認(rèn)為128MB) - map任務(wù)總數(shù)小于:(
hive.exec.mode.local.auto.tasks.max
默認(rèn)為4) - 所需的reduce 任務(wù)總數(shù)為1或0。
因此,對(duì)于小數(shù)據(jù)集的查詢,或者對(duì)于多個(gè)map-reduce作業(yè)的查詢(其中后續(xù)作業(yè)的輸入顯著更小)(因?yàn)橄惹白鳂I(yè)中的reduction/filtering),作業(yè)可以在本地運(yùn)行。
請(qǐng)注意,Hadoop服務(wù)器節(jié)點(diǎn)的運(yùn)行時(shí)環(huán)境和運(yùn)行Hive客戶端的機(jī)器(由于不同的jvm版本或不同的軟件庫(kù))可能存在差異。在本地模式下運(yùn)行時(shí),這可能會(huì)導(dǎo)致意外的行為/錯(cuò)誤。還要注意,本地模式執(zhí)行是在一個(gè)單獨(dú)的,子jvm(Hive客戶端)中完成的。如果用戶愿意,可以通過(guò)該選項(xiàng)來(lái)控制此子jvm的最大內(nèi)存量hive.mapred.local.mem
。默認(rèn)情況下,它被設(shè)置為零,在這種情況下,Hive讓Hadoop確定子jvm的默認(rèn)內(nèi)存限制。
配置日志
Hive使用log4j進(jìn)行日志記錄。默認(rèn)情況下,日志不會(huì)通過(guò)CLI發(fā)送到控制臺(tái)。默認(rèn)日志記錄級(jí)別WARN
適用于0.13.0之前的Hive發(fā)行版。從Hive 0.13.0開(kāi)始,默認(rèn)日志記錄級(jí)別為INFO
。
日志存儲(chǔ)在以下目錄中:/tmp/<*user.name*>
-
/tmp/<*user.name*>/hive.log
注意:在本地模式下,在Hive 0.13.0之前,日志文件名是“.log
”而不是“hive.log
”。該錯(cuò)誤在0.13.0版本中得到修復(fù)(參見(jiàn)HIVE-5528和HIVE-5676)。
要配置不同的日志位置,請(qǐng) 在$ HIVE_HOME / conf / hive-log4j.properties中進(jìn)行 hive.log.dir
設(shè)置。確保目錄的權(quán)限已設(shè)置為 chmod 1777 <dir>。
hive.log.dir=*<other_location>*
如果用戶希望,可以通過(guò)添加下面顯示的參數(shù)將日志發(fā)送到控制臺(tái):
bin/hive --hiveconf hive.root.logger=INFO,console //for HiveCLI (deprecated)
bin/hiveserver2 --hiveconf hive.root.logger=INFO,console
或者,用戶通過(guò)使用以下命令來(lái)更改日志記錄級(jí)別:
bin/hive --hiveconf hive.root.logger=INFO,DRFA //for HiveCLI (deprecated)
bin/hiveserver2 --hiveconf hive.root.logger=INFO,DRFA
日志的另一種選擇是TimeBasedRollingPolicy(適用于Hive 1.1.0及更高版本,HIVE-9001),方法是提供DAILY選項(xiàng),如下所示:
bin/hive --hiveconf hive.root.logger=INFO,DAILY //for HiveCLI (deprecated)
bin/hiveserver2 --hiveconf hive.root.logger=INFO,DAILY
請(qǐng)注意,hive.root.logger
通過(guò)'set'命令進(jìn)行設(shè)置不會(huì)更改日志記錄屬性,因?yàn)樗鼈兪窃诔跏蓟瘯r(shí)確定的。
Hive還將查詢?nèi)罩敬鎯?chǔ)在每個(gè)Hive會(huì)話中/tmp/<user.name>/
,但可以使用屬性在hive-site.xml中配置 hive.querylog.location
。從Hive 1.1.0開(kāi)始,查詢的EXPLAIN EXTENDED輸出可以通過(guò)將 hive.log.explain.output 屬性設(shè)置為true 來(lái)記錄在INFO級(jí)別 。
Hadoop集群上,Hive執(zhí)行期間的日志記錄由Hadoop配置控制。通常,Hadoop將為每個(gè)映射生成一個(gè)日志文件,并減少存儲(chǔ)在執(zhí)行任務(wù)的群集機(jī)器上的任務(wù)。日志文件可通過(guò)點(diǎn)擊Hadoop JobTracker Web UI中的“任務(wù)詳細(xì)信息”頁(yè)面獲取。
在使用本地模式(使用mapreduce.framework.name=local
)時(shí),Hadoop / Hive執(zhí)行日志將在客戶端計(jì)算機(jī)上生成。從版本0.6開(kāi)始 - Hive使用hive-exec-log4j.properties
(hive-log4j.properties
僅在缺失時(shí)回退)來(lái)確定默認(rèn)情況下這些日志的傳輸位置。默認(rèn)配置文件為每個(gè)在本地模式下執(zhí)行的查詢生成一個(gè)日志文件并將其存儲(chǔ)在下/tmp/<user.name>
。提供單獨(dú)配置文件的目的是為了使管理員能夠根據(jù)需要集中執(zhí)行日志捕獲(例如在NFS文件服務(wù)器上)。執(zhí)行日志對(duì)調(diào)試運(yùn)行時(shí)錯(cuò)誤非常有用。
有關(guān)WebHCat錯(cuò)誤和日志記錄的信息,請(qǐng)參閱WebHCat手冊(cè)中的錯(cuò)誤代碼和響應(yīng)以及日志文件。
錯(cuò)誤日志對(duì)調(diào)試問(wèn)題非常有用。請(qǐng)將任何錯(cuò)誤(其中有很多!)發(fā)送給他們hive-dev@hadoop.apache.org
。
從Hive 2.1.0開(kāi)始( HIVE-13027),Hive默認(rèn)使用Log4j2的異步記錄器。將hive.async.log.enabled設(shè)置為false將禁用異步日志記錄并回退到同步日志記錄。異步日志記錄可以顯著提高性能,因?yàn)槿罩居涗泴⒃谑褂肔MAX干擾程序隊(duì)列緩沖日志消息的單獨(dú)線程中處理。 有關(guān)優(yōu)點(diǎn)和缺點(diǎn),請(qǐng)參閱https://logging.apache.org/log4j/2.x/manual/async.html。
HiveServer2日志
HiveServer2操作日志適用于從Hive 0.14開(kāi)始的客戶端。請(qǐng)參閱HiveServer2日志記錄以進(jìn)行配置。
審計(jì)日志
對(duì)于每個(gè)Metastore API調(diào)用,都會(huì)從Hive Metastore服務(wù)器記錄審核日志。
審核日志記錄功能和一些相關(guān)功能參數(shù)。它記錄在log4j的INFO級(jí)別,因此您需要確保INFO級(jí)別的日志記錄已啟用(請(qǐng)參閱HIVE-3505 )。日志條目的名稱是“HiveMetaStore.audit”。
在Hive 0.7中為安全客戶端連接(HIVE-1948 )和Hive 0.10為非安全連接(HIVE-3277 ;也參見(jiàn)HIVE-2797 )添加了審計(jì)日志。
Perf Logger
為了通過(guò)PerfLogger獲得性能指標(biāo),您需要為PerfLogger類(HIVE-12675 )設(shè)置DEBUG級(jí)日志記錄。這可以通過(guò)在log4j屬性文件中設(shè)置以下內(nèi)容來(lái)實(shí)現(xiàn)。
log4j.logger.org.apache.hadoop.hive.ql.log.PerfLogger=DEBUG
如果記錄器級(jí)別已通過(guò)hive.root.logger設(shè)置為根目錄下的DEBUG,則上述設(shè)置不需要。
DDL操作
Hive數(shù)據(jù)定義語(yǔ)言 中記錄了 Hive DDL操作。
創(chuàng)建Hive表
hive> CREATE TABLE pokes (foo INT, bar STRING);
創(chuàng)建一個(gè)名為pokes的表,有兩列,第一個(gè)是整數(shù),另一個(gè)是字符串。
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
創(chuàng)建一個(gè)名為invites的表,其中包含兩列和一個(gè)名為ds的分區(qū)列。分區(qū)列是虛擬列。它不是數(shù)據(jù)本身的一部分,而是從特定數(shù)據(jù)集加載到的分區(qū)派生而來(lái)。
默認(rèn)情況下,表假定為文本輸入格式,分隔符假定為^ A(ctrl-a)。
瀏覽表格
hive> SHOW TABLES;
列出了所有的表格。
hive> SHOW TABLES '.*s';
列出以's'結(jié)尾的所有表格。模式匹配遵循Java正則表達(dá)式。查看文檔http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html的鏈接。
hive> 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');
請(qǐng)注意,REPLACE COLUMNS將替換所有現(xiàn)有的列,并僅更改表的schema,而不是數(shù)據(jù)。該表必須使用本地SerDe。REPLACE COLUMNS也可用于從表格模式中刪除列:
hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');
Drop tables :
hive> DROP TABLE pokes;
元數(shù)據(jù)存儲(chǔ)
元數(shù)據(jù)位于嵌入式Derby數(shù)據(jù)庫(kù)中,其磁盤(pán)存儲(chǔ)位置由Hive配置變量javax.jdo.option.ConnectionURL
。默認(rèn)情況下這個(gè)位置是./metastore_db
(見(jiàn)conf/hive-default.xml
)。
目前,在默認(rèn)配置中,此元數(shù)據(jù)一次只能由一個(gè)用戶看到。
Metastore可以存儲(chǔ)在任何由JPOX支持的數(shù)據(jù)庫(kù)中。位置和RDBMS的類型可以通過(guò)兩個(gè)變量來(lái)控制javax.jdo.option.ConnectionURL
和javax.jdo.option.ConnectionDriverName
。有關(guān)支持的數(shù)據(jù)庫(kù)的更多詳細(xì)信息,請(qǐng)參閱JDO(或JPOX)文檔。數(shù)據(jù)庫(kù)模式在JDO元數(shù)據(jù)注釋文件package.jdo
中定義src/contrib/hive/metastore/src/model
。
在將來(lái),Metastore本身可以是一個(gè)獨(dú)立的服務(wù)器。
如果要將Metastore作為網(wǎng)絡(luò)服務(wù)器運(yùn)行,以便可以從多個(gè)節(jié)點(diǎn)訪問(wèn)它,請(qǐng)參閱Hive在服務(wù)器模式下使用Derby。
DML操作
Hive數(shù)據(jù)操作語(yǔ)言中記錄了Hive DML操作。
將文件中的數(shù)據(jù)加載到Hive中:
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
將包含由ctrl-a分隔的兩列的文件加載到pokes表中。'LOCAL'表示輸入文件在本地文件系統(tǒng)上。如果'LOCAL'被省略,那么它會(huì)在HDFS中查找該文件。
關(guān)鍵字'覆蓋'表示表中的現(xiàn)有數(shù)據(jù)被刪除。如果忽略'OVERWRITE'關(guān)鍵字,則將數(shù)據(jù)文件附加到現(xiàn)有數(shù)據(jù)集。
注意:
- 加載命令不執(zhí)行對(duì)模式的數(shù)據(jù)驗(yàn)證。
- 如果文件位于hdfs中,則將其移入Hive控制的文件系統(tǒng)名稱空間。
Hive目錄的根目錄由選項(xiàng)指定hive.metastore.warehouse.dir
在hive-default.xml
。我們建議用戶在嘗試通過(guò)Hive創(chuàng)建表之前創(chuàng)建該目錄。
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');
上面的兩個(gè)LOAD語(yǔ)句將數(shù)據(jù)加載到表invites的兩個(gè)不同分區(qū)中。表必須創(chuàng)建為按鍵ds分區(qū)才能成功。
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
上述命令會(huì)將數(shù)據(jù)從HDFS文件/目錄加載到表中。
請(qǐng)注意,從HDFS加載數(shù)據(jù)將導(dǎo)致移動(dòng)文件/目錄。因此,該操作幾乎是即時(shí)的。
SQL操作
選擇中記錄了Hive查詢操作。
示例查詢
下面顯示了一些示例查詢。他們?cè)?code>build/dist/examples/queries目錄下。
更多可在Hive資源中找到ql/src/test/queries/positive
。
選擇和過(guò)濾器
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
從ds=2008-08-15
該invites
表的所有分區(qū)行中選擇'foo'列。結(jié)果不存儲(chǔ)在任何地方,但顯示在控制臺(tái)上。
請(qǐng)注意,在隨后的所有示例中INSERT
(可以插入Hive表,本地目錄或HDFS目錄)都是可以的。
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
從表的分區(qū)ds=2008-08-15
中選擇所有行invites
到HDFS目錄中。結(jié)果數(shù)據(jù)在該目錄中的文件中(取決于映射器的數(shù)量)。
注:如果使用*選擇分區(qū)列。它們也可以在投影子句中指定。
分區(qū)表必須始終WHERE
在語(yǔ)句的子句中選擇一個(gè)分區(qū)。
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;
選擇一列的sum。avg, min, or max 也可以使用。請(qǐng)注意,對(duì)于不包含HIVE-287的Hive版本,您需要使用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;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
請(qǐng)注意,對(duì)于不包含HIVE-287的Hive版本,您需要使用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';
在映射階段通過(guò)腳本/bin/cat
流式傳輸數(shù)據(jù)(如Hadoop流式傳輸)。
同樣,流式傳輸可以用在reduce方面(請(qǐng)參閱Hive教程以獲得示例)。
簡(jiǎn)單的示例用例
MovieLens用戶評(píng)級(jí)
首先,用制表符分隔的文本文件格式創(chuàng)建一個(gè)表格:
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
然后,從下載數(shù)據(jù)文件MovieLens 100K的上GroupLens數(shù)據(jù)集頁(yè)(其中也有一個(gè)readme.txt文件,并解壓縮文件索引):
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
要么:
curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip
注意:如果到GroupLens數(shù)據(jù)集的鏈接 不起作用,請(qǐng)報(bào)告HIVE-5341或發(fā)送郵件到user@hive.apache.org郵件列表。
解壓縮數(shù)據(jù)文件:
unzip ml-100k.zip
并加載u.data
到剛剛創(chuàng)建的表中:
LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;
計(jì)算表u_data中的行數(shù):
SELECT COUNT(*) FROM u_data;
請(qǐng)注意,對(duì)于不包含HIVE-287的舊版Hive ,您需要使用COUNT(1)來(lái)代替COUNT(*)。
現(xiàn)在我們可以在表格上進(jìn)行一些復(fù)雜的數(shù)據(jù)分析u_data
:
創(chuàng)建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';
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;
請(qǐng)注意,如果你使用的蜂巢0.5.0或更早的版本,你需要使用COUNT(1)
的地方COUNT(*)
。
Apache Weblog數(shù)據(jù)
Apache weblog的格式是可定制的,而大多數(shù)網(wǎng)站管理員使用默認(rèn)格式。
對(duì)于默認(rèn)的Apache Weblog,我們可以使用以下命令創(chuàng)建一個(gè)表。
有關(guān)RegexSerDe的更多信息,請(qǐng)參閱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;