第一部分
什么是Hive:
Hive是基于Hadoop之上的數(shù)據(jù)倉庫纷闺,數(shù)據(jù)存放在HDFS上甜紫,它同樣可以通過ETL來進行數(shù)據(jù)的抽取薪贫、轉(zhuǎn)換和加載昔期。同時Hive可以自己開發(fā)Mapreduce程序來完成本身不能提供的數(shù)據(jù)處理操作已卸。Hive本身就是一個SQL的解析引擎,他將SQL 語句轉(zhuǎn)成Mapreduce任務(wù)在hadoop之上執(zhí)行镇眷。
什么是數(shù)據(jù)倉庫:
數(shù)據(jù)倉庫是一個面向主題的咬最,集成的,不可更新的欠动,隨時間不變化的數(shù)據(jù)集合永乌,它用于支持企業(yè)或組織的決策分析處理。
針對數(shù)據(jù)倉庫的概念的解釋:首先數(shù)據(jù)倉庫中的數(shù)據(jù)是面向主題的具伍,也就是這些數(shù)據(jù)的都是為了描述同一類事情翅雏,同時它的數(shù)據(jù)主要用于查詢操作,不會對數(shù)據(jù)倉庫中的數(shù)據(jù)進行刪除和更新操作人芽。
OLTP: 聯(lián)機事務(wù)處理(面向的是事務(wù)望几,需要實時的更新操作,銀行轉(zhuǎn)賬)
OLAP: 聯(lián)機分析處理(面向歷史數(shù)據(jù)萤厅,進行數(shù)據(jù)的分析與挖掘橄抹,主要面向查詢靴迫,不會做更新和插入數(shù)據(jù),推薦系統(tǒng))
注意:
在搭建數(shù)據(jù)倉庫的過程最常用的兩種模型就是:星型模型和雪花模型楼誓,雪花模型是在星型模型上發(fā)展出來的玉锌。什么是星型模型,比如一個商品的推薦系統(tǒng)疟羹,主題應(yīng)該是商品主守,但是圍繞商品的有客戶信息、廠家信息榄融、促銷信息等很多信息参淫,這樣就組成了一個星型模型。但是客戶信息中也存在客戶的家庭的信息愧杯、地址信息等涎才。這樣再關(guān)聯(lián)的話就是一個雪花模型了。
第二部分
Hive的體系結(jié)構(gòu):
Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中(metastore)民效,這個數(shù)據(jù)庫支持mysql憔维、derby等數(shù)據(jù)庫中。Hive默認是存儲在derby數(shù)據(jù)庫中畏邢。
Hive的元數(shù)據(jù)有哪些业扒? 包括表的名字、表的列和分區(qū)及其屬性舒萎,表的屬性包括是否為外部表等程储,表的數(shù)據(jù)所在目錄等。
首先Hive是基于Hadoop的臂寝,所以hive的數(shù)據(jù)會使用HDFS進行保存章鲤,同時hive的查詢操作也是轉(zhuǎn)化成hadoop的MapReduce操作,所以在hive中會存在一個Hive Driver:包括編譯器咆贬、解析器和優(yōu)化器败徊。
在Hive的驅(qū)動之前有訪問接口、jdbc以及WebConsole等方式進行操作掏缎。當(dāng)然hive的元信息是存放在關(guān)系型數(shù)據(jù)庫中的皱蹦。
HQL的執(zhí)行過程:
解釋器、編譯器眷蜈、優(yōu)化器完成HQL查詢語句從詞法分析沪哺、語法分析、編譯酌儒、優(yōu)化以及查詢計劃的生成辜妓。生成的查詢計劃存儲在HDFS中,并在隨后的Mapreduce調(diào)用執(zhí)行。
第三部分
Hive的安裝:
Hive的官網(wǎng)地址: hive.apache.org apache 的歷史工程發(fā)布頁面在: archive.apache.org籍滴,在這個頁面下可以找到hive工程酪夷。這里使用的是0.13版本。
Hive的安裝之前需要先將hadoop安裝好异逐,hive有三種安裝方式:嵌入模式捶索、本地模式、遠程模式灰瞻。
嵌入模式:Hive將元信息存儲在Hive自帶的Derby數(shù)據(jù)庫中。但是這種操作方式存在一些缺陷: 1. 只允許創(chuàng)建一個連接辅甥,也就是只允許一個用戶操作hive 2. 多用于Demo
在安裝hive之前需要先安裝hadoop酝润,然后把hive的壓縮包解壓,在bin目錄下執(zhí)行./hive進入hive的啟動腳本璃弄,這種方式就是使用的嵌入式模式啟動hive要销,會在當(dāng)前目錄下生成一個metastore_db的目錄,這個就是元信息目錄夏块。
本地模式:Hive將元信息存儲在mysql數(shù)據(jù)庫中疏咐,mysql數(shù)據(jù)庫與hive運行在同一臺物理機上。這種方式可以允許多個用戶操作hive脐供,可以用于開發(fā)和測試浑塞。
遠程模式:(推薦使用這種方式)hive將元信息存儲在mysql數(shù)據(jù)庫中,mysql數(shù)據(jù)庫與hive運行在不同的物理機上政己。
元信息存儲在遠程的mysql中酌壕。進入遠程mysql中,mysql -u … -p … , 進入后使用create database hive創(chuàng)建一個hive數(shù)據(jù)庫來保存元數(shù)據(jù)歇由。
在hive解壓后卵牍,把mysql的驅(qū)動jar包上傳到hive的lib目錄中。這樣hive才能操作mysql數(shù)據(jù)庫沦泌。然后需要更改hive的配置文件糊昙。在conf中創(chuàng)建一個hive-site.xml文件,文件的內(nèi)容如下:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://ip:3306/hive</value>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
當(dāng)配置文件設(shè)置完后以后谢谦,就可以啟動hive了释牺。
第四部分
Hive的管理
使用hive的腳本直接進入hive,或者 hive –service cli
cli常用的命令:
- 清屏:ctrl + l 或者 !clear;
- 查看數(shù)據(jù)倉庫中的表: show tables;
- 查看數(shù)據(jù)倉庫中的函數(shù):show functions;
- 查看表結(jié)構(gòu): desc 表名他宛;
- 查看hdfs上的文件列表: dfs -ls /user 查看hadoop上/user上的文件
- 執(zhí)行l(wèi)inux命令: !命令
- 執(zhí)行HQL語句:select * from test;當(dāng)執(zhí)行這個語句的時候是不會開啟一個MapReduce任務(wù)的船侧,因為這個是獲取全部的數(shù)據(jù),獲取全部的數(shù)據(jù)只需要把所有的數(shù)據(jù)讀取出來就可以了厅各,并不需要啟動一個任務(wù)镜撩。但是在執(zhí)行select name from test;查詢某一個字段的信息的時候就需要啟動一個MapReduce任務(wù)了。
- 可以執(zhí)行一個sql腳本:source /root/test.sql 這個語句就是啟動一個執(zhí)行sql腳本。這種方式就是和mysql執(zhí)行外部的信息一樣袁梗。
- hive -S 進入hive啟動任務(wù)不會產(chǎn)生調(diào)試信息宜鸯,直接產(chǎn)生MapReduce的結(jié)果。
- hive -e 執(zhí)行sql語句遮怜。hive -e ‘show tables’;這樣的執(zhí)行就直接在linux的命令行操作就行淋袖,并不需要進入hive的交互式中執(zhí)行。
Web界面方式:
啟動方式: #hive –service hwi & 在0.13.0中并沒有包含web管理的war包锯梁,需要自己編譯即碗。
下載hive源碼包,并且解壓源碼包陌凳,然后進入源碼路徑下的hwi目錄剥懒,使用:jar cvfM0 hive-hwi-0.13.0.war -C web/ . 這樣就會打成一個war包,把這個war包拷貝到hive的lib目錄下合敦,同時需要修改hive-site.xml 配置文件初橘,這個修改可以在wiki上看到。
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>
<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-0.13.0.war</value>
<description>This is the WAR file with the jsp content for Hive Web Interface</description>
</property>
這個就可以使用hive –service hwi啟動web服務(wù)了充岛,但是在訪問這個web應(yīng)用的時候保檐,瀏覽器還是報出了500的錯誤。這個問題需要拷貝jdk的tools.jar 拷貝到hive的lib目錄下崔梗。
這個時候就可以打開這個web界面了夜只。
hive的遠程服務(wù)
啟動hive的遠程服務(wù)的命令如下: hive –service hiveserver & 如果要使用jdbc連接hive進行操作,這個時候就需要開啟hive的遠程服務(wù)炒俱。
第五部分
Hive的數(shù)據(jù)類型
基本數(shù)據(jù)類型:
tinyint/smallint/int/bigint 整數(shù)類型
float/double 浮點類型
boolean 布爾類型
string/varchar/char 字符串類型復(fù)雜數(shù)據(jù)類型:
array:數(shù)組類型盐肃,由一系列相同的數(shù)據(jù)類型的元素組成
map:集合類型,包含key->value鍵值對权悟,可以通過key來訪問元素砸王。
struct:結(jié)構(gòu)類型,可以包含不同數(shù)據(jù)類型的元素峦阁,這些元素可以通 過“點語法”的方式來得到所需要的元素谦铃。
create table student (
age int,
name string,
grade array<float>);
插入的時候就是: {1, wangmin, [10,20,30]};
create table student1 (
sid int,
sname string,
grade map<string, float>);
插入數(shù)據(jù)的時候: {1,wangmin,<'大學(xué)語文', 85>}
create table studnet3(
sid int,
sname string,
grades array<map<string, float>>);
插入數(shù)據(jù)的時候:{1, wangmin, [<'大學(xué)語文‘, 12>,<'大學(xué)英語’榔昔,23>]}
create table student4(
sid int,
info struct<nname:string, age:int, sex:string>);
插入數(shù)據(jù)的時候:{1, {'wangmin', 23, ‘男’}}
- 時間類型:
Date: 日期(年月日)
Timestamp: 是unix的一個時間偏移量
select unix_timestamp(); 查看系統(tǒng)的時間偏移量
第六部分
Hive的數(shù)據(jù)存儲
基于HDFS驹闰,沒有專門的數(shù)據(jù)存儲格式
Hive的數(shù)據(jù)模型:
表可以分成以下幾種:
- Table 內(nèi)部表
- Partition 分區(qū)表
- External Table 外部表
- Bucket Table 桶表
create table t1
(tid int, tname string, age int);
create table t2
(tid int, tname string age int);
localtion '/mytable/hive/t2';
create table t3
(tid int, tname string, age int)
row format delimited fields terminated by ',';
create table t4
as
select * from sample_date;
create table t5
row format delimited fields terminated by ','
as
select * from sample_data;
分區(qū)表:
create table partition_table
(sid int, sname string)
partitioned by (gender string)
row format delimited fields terminated by ',';
創(chuàng)建這張表的時候就是以gender進行分區(qū) 分區(qū)表能夠加快查詢效率