hive 中某个字段等于0_快速了解hive
作者丨HappyMint
文章選摘:大數(shù)據(jù)與人工智能
這是作者的第7篇文章
本文主要針對從事大數(shù)據(jù)分析和架構(gòu)相關(guān)工作,需要與hive打交道但目前對hive還沒有進(jìn)行深層次了解的小伙伴,希望本文會讓你對hive有一個快速的了解。
內(nèi)容主要包括什么是hive、為什么要有hive、hive的架構(gòu)、hive的數(shù)據(jù)組織以及hive的使用之DDL操作。
1.什么是 hive?
1 ?是基于 Hadoop 的一個數(shù)據(jù)倉庫工具;
2 ?可以將結(jié)構(gòu)化的數(shù)據(jù)映射為一張數(shù)據(jù)庫表;
3 ?并提供 HQL(Hive SQL)查詢功能;
4 ?底層數(shù)據(jù)是存儲在 HDFS 上;
5 ?Hive的本質(zhì)是將 SQL 語句轉(zhuǎn)換為 MapReduce、Tez 或者 spark 等任務(wù)執(zhí)行;
6 ?適用于離線的批量數(shù)據(jù)計算。
2. 為什么要有 hive??
如上文第5點已經(jīng)提到的,hive可以封裝MapReduce、Tez、Spark等這些引擎的處理過程,讓使用者在不了解這些計算引擎具體執(zhí)行細(xì)節(jié)的情況下就可以處理數(shù)據(jù),使用者只需要學(xué)會如何寫sql即可。
hive可很好的解決直接使用 MapReduce、Tez、Spark等時所面臨的兩個主要問題:
① 直接使用 MapReduce、Tez、Spark學(xué)習(xí)成本太高,因為需要了解底層具體執(zhí)行引擎的處理邏輯,而且需要一定的編碼基礎(chǔ);而Hive提供直接使用類sql語言即可進(jìn)行數(shù)據(jù)查詢和處理的平臺或接口,只要使用者熟悉sql語言即可;
② MapReduce、Tez、Spark實現(xiàn)復(fù)雜查詢邏輯開發(fā)難度大,因為需要自己寫代碼實現(xiàn)整個處理邏輯以及完成對數(shù)據(jù)處理過程的優(yōu)化,而hive將很多數(shù)據(jù)統(tǒng)計邏輯封裝成了可直接使用的窗口函數(shù),且支持自定義窗口函數(shù)來進(jìn)行擴(kuò)展,而且hive有邏輯和物理優(yōu)化器,會對執(zhí)行邏輯進(jìn)行自動優(yōu)化。
3. hive的架構(gòu)??
作為hadoop的一個數(shù)據(jù)倉庫工具,hive的架構(gòu)設(shè)計如下:
可以看出,Hive的內(nèi)部架構(gòu)總共分為四大部分:
1 ?用戶接口層(cli、JDBC/ODBC、Web UI)
(1) cli (Command Line Interface),shell終端命令行,通過命令行與hive進(jìn)行交互;
(2) JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客戶端,用戶(開發(fā)員,運維人員)通過客戶端連接至 Hive server 服務(wù);
(3)Web UI,通過瀏覽器訪問hive。
2? 元數(shù)據(jù)存儲系統(tǒng)
(1)??元數(shù)據(jù)?,通俗的講,就是存儲在 Hive 中的數(shù)據(jù)的描述信息;
(2)Hive 中的元數(shù)據(jù)通常包括:表的名字,表的列和分區(qū)及其屬性,表的屬性(內(nèi)部表和 外部表),表中數(shù)據(jù)所在的目錄;
(3)Metastore 默認(rèn)存在自帶的 Derby 數(shù)據(jù)庫或者我們自己創(chuàng)建的 MySQL 庫中;
(4)Hive 和 MySQL或Derby 之間通過 MetaStore 服務(wù)交互。
3? Thrift Server-跨語言服務(wù)
Hive集成了Thrift Server,讓用戶可以使用多種不同語言來操作hive。
4? Driver(Compiler/Optimizer/Executor)
Driver完成HQL查詢語句的詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS上,并由MapReduce調(diào)用執(zhí)行。
整個過程的執(zhí)行步驟如下:
(1) 解釋器完成詞法、語法和語義的分析以及中間代碼生成,最終轉(zhuǎn)換成抽象語法樹;
(2) 編譯器將語法樹編譯為邏輯執(zhí)行計劃;
(3) 邏輯層優(yōu)化器對邏輯執(zhí)行計劃進(jìn)行優(yōu)化,由于Hive最終生成的MapReduce任務(wù)中,而Map階段和Reduce階段均由OperatorTree組成,所以大部分邏輯層優(yōu)化器通過變換OperatorTree,合并操作符,達(dá)到減少MapReduce Job和減少shuffle數(shù)據(jù)量的目的;
(4) 物理層優(yōu)化器進(jìn)行MapReduce任務(wù)的變換,生成最終的物理執(zhí)行計劃;
(5) 執(zhí)行器調(diào)用底層的運行框架執(zhí)行最終的物理執(zhí)行計劃。
4.?hive的數(shù)據(jù)組織??
通過上文對hive的內(nèi)部架構(gòu)進(jìn)行的介紹和解析,相信大家對一條查詢語句的整個底層執(zhí)行過程有了一點概念;接下來我們再來了解下hive的另一個重要知識點,即查詢語句中用到的庫表相關(guān)方面的知識——hive的數(shù)據(jù)組織方式。
hive數(shù)據(jù)組織:
1 ?Hive 的存儲結(jié)構(gòu)包括?數(shù)據(jù)庫、表、視圖、分區(qū)和表數(shù)據(jù)?等。數(shù)據(jù)庫,表,分區(qū)等都對應(yīng)HDFS上的一個目錄。表數(shù)據(jù)對應(yīng) HDFS 對應(yīng)目錄下的文件。
2 ?Hive 中包含以下數(shù)據(jù)模型:
?database?:在 HDFS 中表現(xiàn)為${hive.metastore.warehouse.dir}或者指定的目錄下的一個文件夾;
?table?:在 HDFS 中表現(xiàn)為某個 database 目錄下一個文件夾;
?external table?:與 table 類似,在 HDFS 中也表現(xiàn)為某個 database 目錄下一個文件夾;
?partition?:在 HDFS 中表現(xiàn)為 table 目錄下的子目錄;
?bucket?:在 HDFS 中表現(xiàn)為同一個表目錄或者分區(qū)目錄下根據(jù)某個字段的值進(jìn)行 hash 散列之后的多個文件;
?view?:與傳統(tǒng)數(shù)據(jù)庫類似,只讀,基于基本表創(chuàng)建。
3 ?Hive 中的表分為內(nèi)部表、外部表、分區(qū)表和 Bucket 表。
?內(nèi)部表和外部表的區(qū)別:
1.內(nèi)部表數(shù)據(jù)由Hive自身管理,外部表數(shù)據(jù)由HDFS管理;
2.刪除內(nèi)部表會直接刪除元數(shù)據(jù)(metadata)及存儲數(shù)據(jù);刪除外部表僅僅會刪除元數(shù)據(jù),HDFS上的文件并不會被刪除。
?分區(qū)表和分桶表的區(qū)別:
1.分區(qū)表,Hive 數(shù)據(jù)表可以根據(jù)某些字段進(jìn)行分區(qū)操作,細(xì)化數(shù)據(jù)管理,讓部分查詢更快;
2.分桶表:表和分區(qū)也可以進(jìn)一步被劃分為桶,分桶表中的數(shù)據(jù)是按照某些分桶字段進(jìn)行 hash 散列形成的多個文件。
5.?hive的使用之DDL操作
關(guān)于hive的DDL(Data Definition Language)操作,以下分為庫和表兩方面來歸納:
庫
(1) 創(chuàng)建庫
(2) 查看庫
(3) 刪除庫
(4) 切換庫
表
1 創(chuàng)建表
(1)創(chuàng)建默認(rèn)的內(nèi)部表
(2)創(chuàng)建外部表
(3)創(chuàng)建分區(qū)表
添加分區(qū)
(4)創(chuàng)建分桶表
(5)使用CTAS創(chuàng)建表
從一個查詢SQL的結(jié)果來創(chuàng)建一個表進(jìn)行存儲;
(6)復(fù)制表結(jié)構(gòu)
2?查看表
(1) 查看表列表
(2) 查看表的詳細(xì)信息
(3) 修改表
(4) 刪除表
(5) 清空表
結(jié)語:
本文主要整體性的給大家介紹了下什么是hive、使用hive的原因、hive的架構(gòu)、hive的數(shù)據(jù)組織以及hive的DDL操作,希望閱讀完本文的小伙伴們,對hive有一個快速的了解。
-END-
總結(jié)
以上是生活随笔為你收集整理的hive 中某个字段等于0_快速了解hive的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中队列控制的方法,学习猿地-php
- 下一篇: 编写一个C程序,实现以下功能:动态申请长