溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hive怎么用

發(fā)布時(shí)間:2021-12-10 10:21:42 來源:億速云 閱讀:141 作者:小新 欄目:云計(jì)算

這篇文章主要介紹了Hive怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

#簡介#

Apache 頂級項(xiàng)目Hive數(shù)據(jù)倉庫軟件便于查詢和管理駐留在分布式存儲上的大型數(shù)據(jù)集.他提供了:

  • 能夠進(jìn)行簡單的數(shù)據(jù)提取/轉(zhuǎn)換/加載(ETL)的工具

  • 一種使各種各樣的數(shù)據(jù)格式結(jié)構(gòu)化的機(jī)制

  • 訪問直接存儲在Apache HDFS上的文件或者其他數(shù)據(jù)存儲系統(tǒng)上的文件例如的Apache HBase

  • 通過MapReduce執(zhí)行查詢

Hive定義了一種簡單的類似SQL的語言,叫做QL。它使熟悉SQL語句的用戶可以查詢數(shù)據(jù)。同時(shí),這種語言也可以使熟悉MapReduce框架的編程人員通過插入他們自定義的map和reduce來執(zhí)行更加復(fù)雜的這種語言內(nèi)置功能不支持的復(fù)雜分析。QL也可以使用自定義的標(biāo)量函數(shù)(UDF's),聚合函數(shù)(UDAF's)和表函數(shù)(UDTF's)擴(kuò)展。

Hive并不強(qiáng)制數(shù)據(jù)讀寫使用“Hive format"--沒有這樣的事。Hive在Thrift上工作的同樣很好,控制分離,或者你的特殊的數(shù)據(jù)格式。Please see File Formats and Hive SerDe in the Developer Guide for details.

Hive的設(shè)計(jì)不適合OLTP,也沒有提供實(shí)時(shí)的查詢和row級別的更新。它最擅長用于大型僅追加的數(shù)據(jù)集(就像web日志)的批量job。Hive最看重的是他的伸縮性(使用更多的及其動態(tài)的添加到Hadoop集群進(jìn)行擴(kuò)展),可擴(kuò)展性(使用MapReduce框架和UDF/UDAF/UDTF),容錯性,和對于他的輸入格式的低耦合行。

Hive的組建包括HCatalog和WebHCat,HCatalog是Hive的一個(gè)組件。它是Hadoop的一個(gè)表和存儲管理層,是用戶能夠使用不同的數(shù)據(jù)處理工具,包括Pig和MapReduce,來更加方便的在Grid上讀寫數(shù)據(jù)。

WebHCat提供一個(gè)服務(wù),你可以使用它運(yùn)行Hadoop MapReduce(或者YARN),Pig,Hive job,或者使用HTTP(RESTFul風(fēng)格)接口執(zhí)行Hive元數(shù)據(jù)操作。

#安裝和配置# 你可以通過下載壓縮包安裝Hive的穩(wěn)定版本,或者你可以下載Hive的源代碼并從中構(gòu)建Hive。

##必要條件##

  • Java 1.6

  • Hadoop 0.20.x, 0.23.x, or 2.0.x-alpha

##從一個(gè)穩(wěn)定的版本安裝Hive## 首先從Apache的下載鏡像下載Hive最新的穩(wěn)定版本。

接下倆你需要解壓壓縮包,浙江創(chuàng)建一個(gè)命名為hive-x.y.z(x.y.z是穩(wěn)定版版本)的子目錄。

tar -xzvf hive-x.y.z.tar.gz

設(shè)置環(huán)境變量HIVE_HOME 指向這個(gè)安裝目錄。

cd hive-x.y.z export HIVE_HOME={{pwd}}

最后,添加$HIVE_HOME/bin到你的PATH

export $PATH:$HIVE_HOME/bin

##運(yùn)行Hive## Hive使用Hadoop,所以:

  • 你需要添加Hadoop到你的PATH,或者

  • export HADOOP_HOME=<hadoop-install-dir>

此外,在你zaiHive中創(chuàng)建一個(gè)表之前,你必須在HDFS中創(chuàng)建/tmp和/user/hive/warehouse并且設(shè)置它們chmod g+w。

進(jìn)行此設(shè)置的命令:

$ $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

你將會發(fā)現(xiàn)設(shè)置HIVE_HOME是有用的,雖然他不是必需的。

$ export HIVE_HOME=<hive-install-dir>

在shell下使用Hive的命令行接口(CLI):

$ $HIVE_HOME/bin/hive

#DDL操作# Hive的DDL操作都記錄在 Hive Data Definition Language.

###創(chuàng)建Hive表###

CRATE TABLE pokes (foo INT,bar STRING);

創(chuàng)建一個(gè)擁有兩列的叫做pokes的表,第一列是一個(gè)integer,第二列是一個(gè)String。

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

創(chuàng)建一個(gè)表invites,它有兩列和一個(gè)叫做ds的分區(qū)列。分區(qū)列是一個(gè)虛擬的列。它不是數(shù)據(jù)自身的一部分,而是來自一個(gè)特殊的數(shù)據(jù)集被加載到分區(qū)。

默認(rèn)情況下,表設(shè)定輸入格式為text,分隔符假定為^A(ctrl-a).

###瀏覽表###

SHOW TABLES;

列出所有表。

SHOW TABLES '.*S';

列出所有以s結(jié)尾的表。這里的匹配模式遵循JAVA正則表達(dá)式。查看這個(gè)鏈接的文檔: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 替換所有已存在的列并且只改變表結(jié)構(gòu),不改變表數(shù)據(jù)。表必須使用本地的SerDe。REPLACE COLUMNS也可以用于從表結(jié)構(gòu)中刪除列。

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

刪除表

hive> DROP TABLE pokes;

###元數(shù)據(jù)存儲### 元數(shù)據(jù)存儲在一個(gè)遷入的Derby數(shù)據(jù)庫中,它的磁盤位置取決于Hive配置文件中的變量: javax.jdo.option.ConnectionURL.默認(rèn)情況下,這個(gè)位置是./metastore_db(看conf/hive-default.xml)

現(xiàn)在,在默認(rèn)配置下,元數(shù)據(jù)只能在某一時(shí)刻被某一用戶訪問。

元數(shù)據(jù)可以存儲在任何支持JPOX的數(shù)據(jù)庫中。

#DML 操作# Hive DML 操作文檔在 Hive Data Manipulation Language.

從平面文件加載數(shù)據(jù)到Hive:

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

加載一個(gè)包含兩個(gè)列的使用ctrl-a分割的文件到表pokes。'LOCAL'標(biāo)志著這里的輸入文件在本地文件系統(tǒng)上,如果“LOCAL‘缺省將會在HDFS上尋找文件。

關(guān)鍵字'OVERWRITE'標(biāo)志著這個(gè)表中已存在的數(shù)據(jù)會被刪除。如果“OVERWRITE”缺省,數(shù)據(jù)文件將會追加到已存在的數(shù)據(jù)集。

注意:

  • 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');

上面的兩個(gè)加載語句加載數(shù)據(jù)到表invites的兩個(gè)不同的分區(qū)。表invites必須在創(chuàng)建時(shí)使用key ds分區(qū),是這個(gè)操作能夠成功。

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

上面的命令將加載HDFS file/directory 上的數(shù)據(jù)到表中。

注意從HDFS上加載數(shù)據(jù)將導(dǎo)致移動 file/directory。作為結(jié)果,這個(gè)操作幾乎時(shí)瞬時(shí)的。

#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中分區(qū)ds=2008-08-15列名為foo的所有行。查詢結(jié)果并不存儲在任何地方,只是顯示在控制臺上。

注意下面所有的例子中,INSERT(到一個(gè)Hive表,本地目錄,HDFS目錄)是可選的。

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

查詢invites表中分區(qū)ds=2008-08-15的所有行存儲到一個(gè)HDFS目錄。查詢結(jié)果存儲在這個(gè)目錄下的文件(依賴于mapper的數(shù)量)中。

注意: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中的所有行存到一個(gè)本地目錄。

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;

查詢列數(shù)的和,平均值,最小值,最大值同樣可以使用。注意舊版本的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';

這個(gè)通過腳本/bin/cat(類似Hadoop streaming)在map階段流失化數(shù)據(jù)。

類似的——流可以在reduce時(shí)使用(查看Hive Tutorial例子)。

#簡單的使用案例#

##MovieLens 用戶評分## 首先,創(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;

然后,在GroupLens datasets頁面(其中也有一個(gè)README.txt文件和未解壓文件的索引)從MovieLens 100k下載數(shù)據(jù)文件。

wget http://files.grouplens.org/datasets/movielens/ml-100k.zip

或者:

curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip

注意:如果這個(gè)鏈接GroupLens datasets不可用,請?jiān)赱HIVE-5341]報(bào)告這個(gè)問題,或者發(fā)送一個(gè)消息給user@hive.apache.org 郵件組.

解壓這個(gè)數(shù)據(jù)文件:

unzip ml-100k.zip

加載數(shù)據(jù)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;

注意舊版本的Hive,不包括HIVE-287,你需要使用COUNT(1)替換COUNT(*)。

現(xiàn)在我們可以在表u_data上面做些復(fù)雜的分析:

創(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(floa(unixtime)).isoweekday()
  print '\t'.join([userid, movieid, rating, str(weekday)])

使用這個(gè)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 數(shù)據(jù)## Apache weblog的格式是可以定制的。但是大多數(shù)web管理員都使用默認(rèn)的(配置)。

對于默認(rèn)的Apache weblog,我們可以通過下面的命令創(chuàng)建一個(gè)表。

更多關(guān)于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;

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Hive怎么用”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI