共計 3372 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 hive 函數有什么用,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先我們要知道 hive 到底是做什么的。下面這幾段文字很好的描述了 hive 的特性:
1.hive 是基于 Hadoop 的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的 sql 查詢功能,可以將 sql 語句轉換為 MapReduce 任務進行運行。其優點是學習成本低,可以通過類 SQL 語句快速實現簡單的 MapReduce 統計,不必開發專門的 MapReduce 應用,十分適合數據倉庫的統計分析。
2.Hive 是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析工作。
要理解 hive,必須先理解 hadoop 和 mapreduce,如果有不熟悉的童鞋,可以百度一下。
使用 hive 的命令行接口,感覺很像操作關系數據庫,但是 hive 和關系數據庫還是有很大的不同,下面我就比較下 hive 與關系數據庫的區別,具體如下:
1.hive 和關系數據庫存儲文件的系統不同,hive 使用的是 hadoop 的 HDFS(hadoop 的分布式文件系統),關系數據庫則是服務器本地的文件系統;
2.hive 使用的計算模型是 mapreduce,而關系數據庫則是自己設計的計算模型;
3. 關系數據庫都是為實時查詢的業務進行設計的,而 hive 則是為海量數據做數據挖掘設計的,實時性很差;實時性的區別導致 hive 的應用場景和關系數據庫有很大的不同;
4.Hive 很容易擴展自己的存儲能力和計算能力,這個是繼承 hadoop 的,而關系數據庫在這個方面要比數據庫差很多。
以上都是從宏觀的角度比較 hive 和關系數據庫的區別,hive 和關系數據庫的異同還有很多,我在文章的后面會一一描述。
下面我來講講 hive 的技術架構,大家先看下面的架構圖:
由上圖可知,hadoop 和 mapreduce 是 hive 架構的根基。Hive 架構包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore 和 Driver(Complier、Optimizer 和 Executor),這些組件我可以分為兩大類:服務端組件和客戶端組件。
首先講講服務端組件:
Driver 組件:該組件包括 Complier、Optimizer 和 Executor,它的作用是將我們寫的 HiveQL(類 SQL)語句進行解析、編譯優化,生成執行計劃,然后調用底層的 mapreduce 計算框架。
Metastore 組件:元數據服務組件,這個組件存儲 hive 的元數據,hive 的元數據存儲在關系數據庫里,hive 支持的關系數據庫有 derby、mysql。元數據對于 hive 十分重要,因此 hive 支持把 metastore 服務獨立出來,安裝到遠程的服務器集群里,從而解耦 hive 服務和 metastore 服務,保證 hive 運行的健壯性,這個方面的知識,我會在后面的 metastore 小節里做詳細的講解。
Thrift 服務:thrift 是 facebook 開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,hive 集成了該服務,能讓不同的編程語言調用 hive 的接口。
客戶端組件:
CLI:command line interface,命令行接口。
Thrift 客戶端:上面的架構圖里沒有寫上 Thrift 客戶端,但是 hive 架構的許多客戶端接口是建立在 thrift 客戶端之上,包括 JDBC 和 ODBC 接口。
WEBGUI:hive 客戶端提供了一種通過網頁的方式訪問 hive 所提供的服務。這個接口對應 hive 的 hwi 組件(hive web interface),使用前要啟動 hwi 服務。
下面我著重講講 metastore 組件, 具體如下:
Hive 的 metastore 組件是 hive 元數據集中存放地。Metastore 組件包括兩個部分:metastore 服務和后臺數據的存儲。后臺數據存儲的介質就是關系數據庫,例如 hive 默認的嵌入式磁盤數據庫 derby,還有 mysql 數據庫。Metastore 服務是建立在后臺數據存儲介質之上,并且可以和 hive 服務進行交互的服務組件,默認情況下,metastore 服務和 hive 服務是安裝在一起的,運行在同一個進程當中。我也可以把 metastore 服務從 hive 服務里剝離出來,metastore 獨立安裝在一個集群里,hive 遠程調用 metastore 服務,這樣我們可以把元數據這一層放到防火墻之后,客戶端訪問 hive 服務,就可以連接到元數據這一層,從而提供了更好的管理性和安全保障。使用遠程的 metastore 服務,可以讓 metastore 服務和 hive 服務運行在不同的進程里,這樣也保證了 hive 的穩定性,提升了 hive 服務的效率。
Hive 的執行流程如下圖所示:
圖描述的很清晰了,我這里就不在累述了。
下面我給大家展示一個簡單的例子,看看 hive 是怎么操作的。
首先我們創建一個普通的文本文件,里面只有一行數據,該行也只存儲一個字符串,命令如下:
echo ‘sharpxiajun /home/hadoop/test.txt
然后我們建一張 hive 的表:
hive –e “create table test (value string);
接下來加載數據:
Load data local inpath ‘home/hadoop/test.txt overwrite into table test
最后我們查詢下表:
hive –e ‘select * from test
大家看到了吧,hive 十分簡單, 很好入門,操作和 sql 很像,下面我就要深入分析下 hive 與關系數據庫的區別,這部分可能有些人看的不是很明白,但是很有必要提前提出,以后我的文章里將進一步講述 hive,那時不太明白的童鞋在看看這部分,很多問題就會清晰很多,具體如下:
1. 關系數據庫里,表的加載模式是在數據加載時候強制確定的(表的加載模式是指數據庫存儲數據的文件格式),如果加載數據時候發現加載的數據不符合模式,關系數據庫則會拒絕加載數據,這個就叫“寫時模式”,寫時模式會在數據加載時候對數據模式進行檢查校驗的操作。Hive 在加載數據時候和關系數據庫不同,hive 在加載數據時候不會對數據進行檢查,也不會更改被加載的數據文件,而檢查數據格式的操作是在查詢操作時候執行,這種模式叫“讀時模式”。在實際應用中,寫時模式在加載數據時候會對列進行索引,對數據進行壓縮,因此加載數據的速度很慢,但是當數據加載好了,我們去查詢數據的時候,速度很快。但是當我們的數據是非結構化,存儲模式也是未知時候,關系數據操作這種場景就麻煩多了,這時候 hive 就會發揮它的優勢。
2. 關系數據庫一個重要的特點是可以對某一行或某些行的數據進行更新、刪除操作,hive 不支持對某個具體行的操作,hive 對數據的操作只支持覆蓋原數據和追加數據。Hive 也不支持事務和索引。更新、事務和索引都是關系數據庫的特征,這些 hive 都不支持,也不打算支持,原因是 hive 的設計是海量數據進行處理,全數據的掃描時常態,針對某些具體數據進行操作的效率是很差的,對于更新操作,hive 是通過查詢將原表的數據進行轉化最后存儲在新表里,這和傳統數據庫的更新操作有很大不同。
3.Hive 也可以在 hadoop 做實時查詢上做一份自己的貢獻,那就是和 hbase 集成,hbase 可以進行快速查詢,但是 hbase 不支持類 SQL 的語句,那么此時 hive 可以給 hbase 提供 sql 語法解析的外殼,可以用類 sql 語句操作 hbase 數據庫
關于“hive 函數有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。