版權聲明:本文爲博主原創文章,未經博主容許不得轉載。mysql
1. Hive是什麼sql
1) Hive是什麼?數據庫
這裏引用 Hive wiki 上的介紹:apache
Hive is a data warehouse infrastructure built on top of Hadoop. It provides tools to enable easy data ETL, a mechanism to put structures on the data, and the capability to querying and analysis of large data sets stored in Hadoop files. Hive defines a simple SQL-like query language, called QL, that enables users familiar with SQL to query the data. At the same time, this language also allows programmers who are familiar with the MapReduce fromwork to be able to plug in their custom mappers and reducers to perform more sophisticated analysis that may not be supported by the built-in capabilities of the language.瀏覽器
Hive 是創建在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱爲 QL,它容許熟悉 SQL 的用戶查詢數據。同時,這個語言也容許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 沒法完成的複雜的分析工做。服務器
Hive does not mandate read or written data be in the 「Hive format」—there is no such thing. Hive works equally well on Thrift, control delimited, or your specialized data formats. Please see File Format and SerDe in Developer Guide for details.
Hive 沒有專門的數據格式。 Hive 能夠很好的工做在 Thrift 之上,控制分隔符,也容許用戶指定數據格式。網絡
2) Hive不是什麼?
oracle
Hive基於hadoop,hadoop是批處理系統,不能保證低延遲,所以,hive的查詢也不能保證低延遲。
Hive的工做模式是提交一個任務,等到任務結束時被通知,而不是實時查詢。相對應的是,相似於oracle這樣的系統當運行於小數據集的時候,響應很是快,可當處理的數據集很是大的時候,可能須要數小時。須要說明的是,hive即便在很小的數據集上運行,也可能須要數分鐘才能完成。
總之,低延遲不是hive追求的首要目標。hive的設計目標是:可伸縮、可擴展、容錯及輸入格式鬆耦合。
app
Hive 資源
Hive 自己提供了較豐富的文檔,如下連接提供了 Hive 的一些基礎文檔:
大多數有關 Hive 的使用和特性的問題能夠從以上的連接中尋找到答案。固然,因爲 Hive 自己在不斷的發展中,文檔的更新速度不少時候都趕不上 Hive 自己的更新速度,若但願瞭解 Hive 的最新動態或者遇到 Bug,能夠加入 Hive 的郵件列表:
* User: hive-user@hadoop.apache.org
* Developer: hive-dev@hadoop.apache.org
1. 爲何使用Hive
2. Hive體系結構
Hive 的結構如圖所示,
主要分爲如下幾個部分:
MetaStore相似於的目錄。它存放了有個表、區、列、類型、規則模型的全部信息。而且它能夠經過thrift接口進修改和查詢。它爲編譯器提供高效的服務,因此,它會存放在一個傳統的RDBMS,利用關係模型進管理。這個信息很是重要,因此須要備份,而且支持查詢的可擴展性。
Hive 將元數據存儲在 RDBMS 中,有三種模式能夠鏈接到數據庫:
首先,Hive 沒有專門的數據存儲格式,也沒有爲數據創建索引,用戶能夠很是自由的組織 Hive 中的表,只須要在建立表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就能夠解析數據。
其次,Hive 中全部的數據都存儲在 HDFS 中,Hive 中包含如下數據模型:Table,External Table,Partition,Bucket。
1)表table:一個表就是hdfs中的一個目錄
2)區Partition:表內的一個區就是表的目錄下的一個子目錄
3)桶Bucket:若是有分區,那麼桶就是區下的一個單位,若是表內沒有區,那麼桶直接就是表下的單位,桶通常是文件的形式。
因爲 Hive 採用了 SQL 的查詢語言 HQL,所以很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有相似的查詢語言,再無相似之處。本文將從多個方面來闡述 Hive 和數據庫的差別。數據庫能夠用在 Online 的應用中,可是Hive 是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。
因爲 SQL 被普遍的應用在數據倉庫中,所以,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者能夠很方便的使用 Hive 進行開發。
Hive 是創建在Hadoop 之上的,全部 Hive 的數據都是存儲在HDFS 中的。而數據庫則能夠將數據保存在塊設備或者本地文件系統中。
Hive 中沒有定義專門的數據格式,數據格式能夠由用戶指定,用戶定義數據格式須要指定三個屬性:列分隔符(一般爲空格、」\t」、」\x001″)、行分隔符 (」\n」)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。因爲在加載數據的過程當中,不須要從用戶數據格式到 Hive 定義的數據格式的轉換,所以,Hive 在加載的過程當中不會對數據自己進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS
目錄中。而在數據庫中,不一樣的數據庫有不一樣的存儲引擎,定義了本身的數據格式。全部數據都會按照必定的組織存儲,所以,數據庫加載數據的過程會比較耗時。
由 於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。所以,Hive 中不支持對數據的改寫和添加,全部的數據都是在加載的時候中肯定好的。而數據庫中的數據一般是須要常常進行修改的,所以可使用 INSERT INTO … VALUES 添加數據,使用 UPDATE… SET 修改數據。
之 前已經說過,Hive 在加載數據的過程當中不會對數據進行任何處理,甚至不會對數據進行掃描,所以也沒有對數據中的某些 Key 創建索引。Hive 要訪問數據中知足條件的特定值時,須要暴力掃描整個數據,所以訪問延遲較高。因爲 MapReduce 的引入, Hive 能夠並行訪問數據,所以即便沒有索引,對於大數據量的訪問,Hive 仍然能夠體現出優點。數據庫中,一般會針對一個或者幾個列創建索引,所以對於少許的特定條件的數據的訪問,數據庫能夠有很高的效率,較低的延遲。因爲數據 的訪問延遲較高,決定了
Hive 不適合在線數據查詢。
Hive 中大多數查詢的執行是經過 Hadoop 提供的 MapReduce 來實現的(相似 select * from tbl 的查詢不須要 MapReduce)。而數據庫一般有本身的執行引擎。
之 前提到,Hive 在查詢數據的時候,因爲沒有索引,須要掃描整個表,所以延遲較高。另一個致使 Hive 執行延遲高的因素是 MapReduce 框架。因爲 MapReduce 自己具備較高的延遲,所以在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。固然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時 候,Hive 的並行計算顯然能體現出優點。
由 於 Hive 是創建在 Hadoop 之上的,所以 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集羣在 Yahoo!,2009年的規模在4000 臺節點左右)。而數據庫因爲 ACID 語義的嚴格限制,擴展行很是有限。目前最早進的並行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。
因爲 Hive 創建在集羣上並能夠利用 MapReduce 進行並行計算,所以能夠支持很大規模的數據;對應的,數據庫能夠支持的數據規模較小。
參考:https://cwiki.apache.org/confluence/display/Hive/Tutorial
1)數據單元
按照數據的粒度大小,hive數據能夠被組織成:
1)databases: 避免不一樣表產生命名衝突的一種命名空間
2)tables:具備相同scema的同質數據的集合
3)partitions:一個表能夠有一個或多個決定數據如何存儲的partition key
4)buckets(或clusters):在同一個partition中的數據能夠根據某個列的hash值分爲多個bucket。partition和bucket並不是必要,可是它們能大大加快數據的查詢速度。
2)、數據類型
(1)簡單類型:
TINYINT - 1 byte integer
SMALLINT - 2 byte integer
INT - 4 byte integer
BIGINT - 8 byte
BOOLEAN - TRUE/ FALSE
FLOAT - 單精度
DOUBLE - 雙精度
STRING - 字符串集合
(2)複雜類型:
Structs: structs內部的數據能夠經過DOT(.)來存取,例如,表中一列c的類型爲STRUCT{a INT; b INT},咱們能夠經過c.a來訪問域a。
Maps(Key-Value對):訪問指定域能夠經過['element name']進行,例如,一個Map M包含了一個group->gid的k-v對,gid的值能夠經過M['group']來獲取。
Arrays:array中的數據爲相同類型,例如,假如array A中元素['a','b','c'],則A[1]的值爲'b'。
3)、內建運算符和函數
包括關係運算符(A=B, A!=B, A<B等等)、
算術運算符(A+B, A*B, A&B, A|B等等)、
邏輯運算符(A&&B, A|B等等)、
複雜類型上的運算符(A[n], M[key], S.x)、
各類內建函數:round,floor,substr
4)、語言能力
hive查詢語言提供基本的類sql操做,這些操做基於table和partition,包括:
1. 使用where語句過濾制定行
2. 使用select查找指定列
3. join兩張table
4. group by
5. 一個表的查詢結果存入另外一張表
6. 將一個表的內容存入本地目錄
7. 將查詢結果存儲到hdfs上
8. 管理table和partition(creat、drop、alert)
9. 在查詢中嵌入map-reduce程序
Hive query language provides the basic SQL like operations. These operations work on tables or partitions. These operations are:
The format of Apache weblog is customizable, while most webmasters use the default.
For default Apache weblog, we can create a table with the following command.
More about !RegexSerDe can be found here in HIVE-662 and 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;