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