hadoop教程十二、hbase hive pig zookeeper在接觸一個(gè)新的事物首先要回到問題是這什么_第1頁
hadoop教程十二、hbase hive pig zookeeper在接觸一個(gè)新的事物首先要回到問題是這什么_第2頁
hadoop教程十二、hbase hive pig zookeeper在接觸一個(gè)新的事物首先要回到問題是這什么_第3頁
hadoop教程十二、hbase hive pig zookeeper在接觸一個(gè)新的事物首先要回到問題是這什么_第4頁
hadoop教程十二、hbase hive pig zookeeper在接觸一個(gè)新的事物首先要回到問題是這什么_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Hive(一)Hive 是什么在接觸一個(gè)新的事物首先要回到是:這是什么?這里Hive wiki 上的介紹:Hive is a data warehouse infrastructure built on top of Hadoop. It provides tools to enable easy dataETL, a mechanism to put structures on the data, and the capability to querying andysis of largedata sets stored in Hadoop files. Hive defines a si

2、mple SQL-like query language, called QL,tenables users familiar with SQL to query the data. At the same time, this language also allowsprogrammers who are familiar with the MapReduce fromwork to be able to plugheir custommappers and reducers to perform more sophisticatedcapabilities of the language.

3、ysist may not be supported by the built-inHive 是建立在 Hadoop 上的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架。它提供了一系列的工具,可以用來進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制。、查詢和分析Hive 定義了簡單的類 SQL 查詢語言,稱為 QL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)。同時(shí),這個(gè)語言也允許熟悉 MapReduce 開發(fā)者的開發(fā)自定義的 mapper 和 reducer 來處理內(nèi)建的mapper 和 reducer 無法完成的復(fù)雜的分析工作。Hive does not mandate read or writ

4、ten data behe “Hive format”there is no such thing. Hiveworks equally well on Thrift, control delimited, or your speFormat and SerDe in Developer Guide for details.lized data formats. Please see FileHive 沒有專門的數(shù)據(jù)格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許用戶指定數(shù)據(jù)格式。Hive資源Hive本身提供了較豐富的文檔,以下提供了Hive的一些基礎(chǔ)文檔:鏡像(被墻

5、): HYPERLINK http:/m/ http:/m頁面:/hiveWiki入門指南:查詢語言指南:演示文稿:藍(lán)圖:大多數(shù)有關(guān) Hive 的使用和特性可以從以上的中尋找到。當(dāng)然,由于 Hive 本身在不斷的發(fā)展中,文檔的更新速度很多時(shí)候都趕不上 Hive 本身的更新速度,若希望了解Hive 的動(dòng)態(tài)或者遇到 Bug,可以加入 Hive 的郵件列表:User: HYPERLINK mailto:hive-userhadoop.apache hive-userhadoop.apache.Developer: HYPERLINK mailto:hive-devhadoop.apache hive

6、-devhadoop.apache.Hive 的配置安裝請(qǐng)參考入門指南, 這里給出最基本的提綱:安裝配置 Hadoop。安裝配置數(shù)據(jù)庫(等)。源獲得Hive碼或者可執(zhí)行代碼。wgettar xzf hive-0.5.0-b cd hive-0.5.0-bin配置 Hive 如何運(yùn)行 Hive。ar.gzHadoop。數(shù)據(jù)庫,如何當(dāng)看到 Hive 提示符Hive的時(shí)候,恭喜,你可以開始你的 Hive 之旅了。Hive(二)Hive 體系結(jié)構(gòu)Hive 的結(jié)構(gòu),主要分為以下幾個(gè)部分:用戶接口,包括 CLI,Cnt,WUI。元數(shù)據(jù),通常是在關(guān)系數(shù)據(jù)庫如, derby 中。解釋器、編譯器、優(yōu)化器、執(zhí)行器

7、。Hadoop:用 HDFS 進(jìn)行,利用 MapReduce 進(jìn)行計(jì)算。用戶接口主要有三個(gè):CLI,Cnt 和 WUI。其中最常用的是 CLI,Cli 啟動(dòng)的時(shí)候,會(huì)同時(shí)啟動(dòng)一個(gè) Hive的時(shí)候,需要副本。Cnt 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動(dòng) Cnt 模式Hive Server 所在節(jié)點(diǎn),并且在該節(jié)點(diǎn)啟動(dòng) Hive Server。 WUI 是通過瀏覽器HiveHive。將元數(shù)據(jù)、derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和在數(shù)據(jù)庫中,如分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法

8、分析、語法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃在 HDFS 中,并在隨后有 MapReduce 調(diào)用執(zhí)行。Hive 的數(shù)據(jù)在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select* from tbl 不會(huì)生成 MapRedcue 任務(wù))。HiveHive元數(shù)據(jù)將元數(shù)據(jù)在 RDBMS 中,有三種模式可以連接到數(shù)據(jù)庫:Single User Mode: 此模式連接到一個(gè)emory 的數(shù)據(jù)庫 Derby,一般用于 Unit Test。Multi User Mode:通過網(wǎng)絡(luò)連接到一個(gè)數(shù)據(jù)庫中,是最經(jīng)常使用到的模式。Remote Server Mo

9、de:用于非 Java 客戶端客戶端利用 Thrift 協(xié)議通過 MetaStoreServerMetaStoreServer,元數(shù)據(jù)庫,在服務(wù)器端啟動(dòng)一個(gè)元數(shù)據(jù)庫。Hive 的數(shù)據(jù)首先,Hive 沒有專門的數(shù)據(jù)格式,也沒有為數(shù)據(jù)建立索戶可以非常的組織 Hive中的表,只需要在創(chuàng)建表的時(shí)候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以據(jù)。數(shù)其次,Hive 中所有的數(shù)據(jù)都Partition,Bucket。在 HDFS 中,Hive 中包含以下數(shù)據(jù)模型:Table,External Table,Hive 中的 Table 和數(shù)據(jù)庫中的 Table 在概念上是類似的,每一個(gè) Table

10、 在 Hive 中都有一個(gè)相應(yīng)的目錄hive-site.xml數(shù)據(jù)。例如,一個(gè)表 pvs,它在 HDFS 中的路徑為:/wh/pvs,其中,wh 是在中由 $hive.metastore.warehouse.dir 指定的數(shù)據(jù)倉庫的目錄,所有的 Table 數(shù)據(jù)(不包括 External Table)都保存在這個(gè)目錄中。Partition 對(duì)應(yīng)于數(shù)據(jù)庫中的據(jù)庫中的很不相同。在 HivePartition 列的密集索引,但是 Hive 中 Partition 的組織方式和數(shù)中,表中的一個(gè) Partition 對(duì)應(yīng)于表下的一個(gè)目錄,所有的 Partition的數(shù)據(jù)都在對(duì)應(yīng)的目錄中。例如:pvs 表

11、中包含 ds 和 city 兩個(gè) Partition,則對(duì)應(yīng)于 ds =20090801, ctry = US 的 HDFS 子目錄為:/wh/pvs/ds=20090801/ctry=US;對(duì)應(yīng)于 ds = 20090801, ctry = CA 的 HDFS 子目錄為;/wh/pvs/ds=20090801/ctry=CABuckets 對(duì)指定列計(jì)算 hash,根據(jù) hash 值切分?jǐn)?shù)據(jù),目的是為了并行,每一個(gè) Bucket 對(duì)應(yīng)一個(gè)文件。將 user 列分散至 32 個(gè) bucket,首先對(duì) user 列的值計(jì)算 hash,對(duì)應(yīng) hash 值為 0的 HDFS 目錄為:/wh/pvs/d

12、s=20090801/ctry=US/part-00000;hash 值為 20 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020External Table 指向已經(jīng)在 HDFS組織上是相同的,而實(shí)際數(shù)據(jù)的中存在的數(shù)據(jù),可以創(chuàng)建 Partition。它和 Table 在元數(shù)據(jù)的則有較大的差異。Table 的創(chuàng)建過程和數(shù)據(jù)加載過程(這兩個(gè)過程可以在同一個(gè)語句中完成),在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù)倉庫目錄中;之后對(duì)數(shù)據(jù)對(duì)刪除表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除。將會(huì)直接在數(shù)據(jù)倉庫目錄中完成。External Table 只有一個(gè)過

13、程, 加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成( CREATE EXTERNALTABLE LOCATION),實(shí)際數(shù)據(jù)是移動(dòng)到數(shù)據(jù)倉庫目錄中。在 LOCATION 后面指定的 HDFS 路徑中,并不會(huì)Hive(三)摘要:由于 Hive 采用了 SQL 的查詢語言 HQL,因此很容易將 Hive 理解為數(shù)據(jù)庫。其實(shí)從結(jié)構(gòu)上來看,Hive 和數(shù)據(jù)庫除了擁有類似的查詢語言,再無類似之處。本文將從多個(gè)方面來闡述 Hive 和數(shù)據(jù)庫的差異。數(shù)據(jù)庫可以用在 Online是Hive 是為數(shù)據(jù)倉庫而設(shè)計(jì)的,清楚這一點(diǎn),有助于從應(yīng)用角度理解的應(yīng)用中,但Hive 的特性。查詢語言HQLSQLRaw Device 或者 Loca

14、l FS系統(tǒng)決定支持有數(shù)據(jù)位置 HDFS數(shù)據(jù)格式數(shù)據(jù)更新索引執(zhí)行執(zhí)行延遲可擴(kuò)展性數(shù)據(jù)規(guī)模用戶定義不支持無MapRedcue Executor高高大低低小1.查詢語言。由于SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉庫中,因此,專門針對(duì) Hive 的特性設(shè)計(jì)了類 SQL 的查詢語言 HQL。熟悉 SQL 開發(fā)的開發(fā)者可以很方便的使用 Hive進(jìn)行開發(fā)。2.數(shù)據(jù)位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數(shù)據(jù)都是在HDFS 中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中。3.數(shù)據(jù)格式。Hive 中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分

15、隔符(通常為空格、”t”、”x001)、行分隔符 (”n”) 以及文件數(shù)據(jù)的方法( Hive 中默認(rèn)有三個(gè)文件格式TextFile,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉(zhuǎn)換,因此,Hive 在加載的過程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容或者移動(dòng)到相應(yīng)的 HDFS 目錄中。而在數(shù)據(jù)庫中,不同的數(shù)據(jù)庫有不同的引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會(huì)按照一定的組織,因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會(huì)比較耗時(shí)。 4.數(shù)據(jù)更新。由于 Hive 是針對(duì)數(shù)據(jù)倉庫應(yīng)用設(shè)計(jì)的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的。因此,Hive

16、 中不支持對(duì)數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時(shí)候中確定好的。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進(jìn)行修改的,因此可以使用 INSERTO .VALUES 添加數(shù)據(jù),使用 UPDATE . SET 修改數(shù)據(jù)。5.索引。之前已經(jīng),Hive 在加載數(shù)據(jù)的過程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描,因此也沒有對(duì)數(shù)據(jù)中的某些 Key 建立索引。Hive 要數(shù)據(jù)中滿足條件的特定值時(shí),需要 MapReduce 的引入, Hive 可以并行掃描整個(gè)數(shù)據(jù),因此延遲較高。由于數(shù)據(jù),因此即使沒有索引,對(duì)于大數(shù)據(jù)量的,Hive 仍然可以體現(xiàn)出優(yōu)勢(shì)。數(shù)據(jù)庫中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引,因此對(duì)于少量的

17、特定條件的數(shù)據(jù)的,數(shù)據(jù)庫可以有很高的效率,較低的延遲。由于數(shù)據(jù) 的延遲較高,決定了 Hive 不適合數(shù)據(jù)查詢。執(zhí)行。Hive 中大多數(shù)查詢的執(zhí)行是通過 Hadoop 提供的 MapReduce 來實(shí)現(xiàn)的(類似 select * from tbl 的查詢不需要 MapReduce)。而數(shù)據(jù)庫通常有自己的執(zhí)行引擎。執(zhí)行延遲。之前提到,Hive 在查詢數(shù)據(jù)的時(shí)候,由于沒有索引,需要掃描整個(gè)表,因此延遲較高。另外一個(gè)導(dǎo)致 Hive 執(zhí)行延遲高的是 MapReduce 框架。由于MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執(zhí)行 Hive 查詢時(shí),也會(huì)有較高的延遲。相對(duì)的,數(shù)據(jù)

18、庫的執(zhí)行延遲較低。當(dāng)然,這個(gè)低是有條件的,即數(shù)據(jù)規(guī)模較小,當(dāng)數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時(shí) 候,Hive 的并行計(jì)算顯然能體現(xiàn)出優(yōu)勢(shì)。8.可擴(kuò)展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴(kuò)展性是和 Hadoop 的可擴(kuò)展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009 年的規(guī)模在 4000 臺(tái)節(jié)點(diǎn)左右)。而數(shù)據(jù)庫由于 ACID 語義的嚴(yán)格限制,擴(kuò)展行非常有限。目前最先進(jìn)的并行數(shù)據(jù)庫 Oracle 在理論上的擴(kuò)展能力也只有 100 臺(tái)左右。 9.數(shù)據(jù)規(guī)模。由于 Hive 建立在集群上并可以利用 MapReduce 進(jìn)行并行計(jì)算,因此可以支

19、持很大規(guī)模的數(shù)據(jù);對(duì)應(yīng)的,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小。Hive(四) HQLHive的文 檔 中 對(duì) 查 詢 語 言 有 了 很 詳 細(xì) 的 描 述 , 請(qǐng) 參 考 :,本文的內(nèi)容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項(xiàng)。Create TableCREATE EXTERNAL TABLE IF NOT EXISTS table_name(col_name data_type COMMENTment, .)COMMENTmentPARTITIONED BY (col_name data_typeCOMMENTment, .)CLUSTERED BY (col_name,

20、col_name, .) SORTED BY (col_name ASC|DESC, .)O num_buckets BUCKETS ROW FORMAT row_format STORED AS file_format LOCATION hdfs_pathCREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項(xiàng)來忽略這個(gè)異常。EXTERNAL 關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅數(shù)據(jù)所在的路徑,不

21、對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候表的元數(shù)據(jù)和數(shù) 據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。LIKE 允許用戶現(xiàn)有的表結(jié)構(gòu),但是不數(shù)據(jù)。用戶在建表的時(shí)候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的數(shù)據(jù)。如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCE 。

22、有分區(qū)的表可以在創(chuàng)建的時(shí)候使用 PARTITIONED BY 語句。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每一個(gè)分區(qū)單獨(dú)存在一個(gè)目錄下。而且,表和分區(qū)都可以對(duì)某個(gè)列進(jìn)行 CLUSTERED BY 操作,將若干個(gè)列放入一個(gè)桶(bucket)中。也可以利用 SORT BY 對(duì)數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。表名和列名不區(qū)分大小寫,SerDe 和屬性名區(qū)分大小寫。表和列的注釋是字符串。Drop Table刪除一個(gè)數(shù)據(jù)。 Alter Table表的同時(shí)會(huì)同時(shí)刪除表的元數(shù)據(jù)和數(shù)據(jù)。刪除一個(gè)外部表,只刪除元數(shù)據(jù)而保留Alter table 語句允許用戶改變現(xiàn)有表的結(jié)構(gòu)。用戶可以增加列/分區(qū),改變 se

23、rde,增加表和 serde熟悉,表本身重命名。Add PartitionsALTER TABLE table_name ADD partition_spec LOCATION location1 partition_spec LOCATION location2 .partition_spec: PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, .)用戶可以用 ALTER TABLE ADD PARTITION 來向一個(gè)表中增加分區(qū)。當(dāng)分區(qū)名是字符串時(shí)加引號(hào)。ALTER TA

24、BLE page_view ADD PARTITION (dt=2008-08-08, country=us)location /path/to/us/part080808 PARTITION (dt=2008-08-09, country=us)location /path/to/us/part080809;DROP PARTITIONALTER TABLE table_name DROP partition_spec, partition_spec,.用戶可以用 ALTER TABLE DROP PARTITION 來刪除分區(qū)。分區(qū)的元數(shù)據(jù)和數(shù)據(jù)將被一并刪除。ALTER TABLE pag

25、e_viewDROP PARTITION (dt=2008-08-08, country=us);RENAME TABLEALTER TABLE table_name RENAME T_table_name這個(gè)命令可以讓用戶為表更名。數(shù)據(jù)所在的位置和分區(qū)名并不改變。換而言之,老的表名并未“釋放”,對(duì)老表的更改會(huì)改變新表的數(shù)據(jù)。Change Column NamementALTER TABLE table_name CHANGE COLUMNcol_old_name col_new_name column_typeCOMMENTment|AFTER column_name這個(gè)命令可以允許用戶修改

26、一個(gè)列的名稱、數(shù)據(jù)類型、注釋或者位置。比如:CREATE TABLE test_change (a, b ALTER TABLE test_change CHANGE a a1, c); 將 a 列的名字改為 a1.ALTER TABLE test_change CHANGE a a1 STRING AFTER b;將 a列的名字改為 a1,a 列, a1 string, c.的數(shù)據(jù)類型改為 string,并將它放置在列 b 之后。新的表結(jié)構(gòu)為: bALTER TABLE test_change CHANGE b b1; 會(huì)將 b 列的名字修改為 b1, 并將它放在第一列。新表的結(jié)構(gòu)為: b1

27、, a string, c.注意:對(duì)列的改變只會(huì)修改 Hive 的元數(shù)據(jù),而不會(huì)改變實(shí)際數(shù)據(jù)。用戶應(yīng)該確定保證元數(shù)據(jù)定義和實(shí)際數(shù)據(jù)結(jié)構(gòu)的一致性。Add/Replace ColumnsALTER TABLE table_name ADD|REPLACECOLUMNS (col_name data_type COMMENTment, .)ADD COLUMNS 允許用戶在當(dāng)前列的末尾增加新的列,但是在分區(qū)列之前。REPLACE COLUMNS 刪除以后的列,加入新的列。只有在使用 native 的 SerDE(DynamicSerDe or MetadaAlter Table Properties

28、ypeColumnsetSerDe)的時(shí)候才可以這么做。ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties: (property_name = property_value, property_name = property_value, . )用戶可以用這個(gè)命令向表中增加 metadata,目前 last_modified_user,last_modified_time 屬性都是由 Hive 自動(dòng)管理的。用戶可以向列表中增加自己的屬性??梢允褂?DESCRIBE EXTENDED TABLE 來

29、獲得這些信息。Add Serde PropertiesALTER TABLE table_nameSET SERDE serde_class_nameWITH SERDEPROPERTIES serde_propertiesALTER TABLE table_nameSET SERDEPROPERTIES serde_propertiesserde_properties: (property_name = property_value, property_name = property_value, . )這個(gè)命令允許用戶向 SerDe 對(duì)象增加用戶定義的元數(shù)據(jù)。Hive 為了序列化和反序列化

30、數(shù)據(jù),將會(huì)初始化 SerDe 屬性,并將屬性傳給表的 SerDe。如此,用戶可以為自定義的 SerDe屬性。Alter Table File Format andanizationALTER TABLE table_name SET FILEFORMAT file_formatALTER TABLE table_name CLUSTERED BY (col_name, col_name, .)SORTED BY (col_name, .)O num_buckets BUCKETS這個(gè)命令修改了表的物理屬性。Loading fileso table當(dāng)數(shù)據(jù)被加載至表中時(shí),不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換。L

31、oad 操作只是將數(shù)據(jù)對(duì)應(yīng)的位置。Syntax:LOAD DATA LOCAL INPATH filepath OVERWRITEO TABLE tablenamePARTITION (partcol1=val1, partcol2=val2 .)Synopsis:/移動(dòng)至 Hive表Load 操作只是單純的filepath 可以是:/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到 Hive 表對(duì)應(yīng)的位置。相對(duì)路徑,例如:project/data1絕對(duì)路徑,例如: /user/hive/project/data1包含模式的完整 URI,例如:hdfs:/namenode:9000/user/hive/projec

32、t/data1加載的目標(biāo)可以是一個(gè)表或者分區(qū)。如果表包含分區(qū),必須指定每一個(gè)分區(qū)的分區(qū)名。filepath 可以一個(gè)文件(這種情況下,Hive 會(huì)將文件移動(dòng)到表所對(duì)應(yīng)的目錄中)或者是一個(gè)目錄(在這種情況下,Hive 會(huì)將目錄中的所有文件移動(dòng)至表所對(duì)應(yīng)的目錄中)。如果指定了 LOCAL,那么:load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。如果發(fā)現(xiàn)是相對(duì)路徑,則路徑會(huì)被解釋為相對(duì)于當(dāng)前用戶的當(dāng)前路徑。用戶也可以為本地文件指定一個(gè)完整的 URI ,比如: file:/user/hive/project/data1.load被命令會(huì)將 filepath 中的文件到目標(biāo)文件系統(tǒng)中。目標(biāo)文件系

33、統(tǒng)由表的位置屬性決定。的數(shù)據(jù)文件移動(dòng)到表的數(shù)據(jù)對(duì)應(yīng)的位置。如果沒有指定 LOCAL 關(guān)鍵字,如果 filepath 指向的是一個(gè)完整的 URI,hive 會(huì)直接使用這個(gè) URI。 否則:如果沒有指定 schema 或者 authority,Hive 會(huì)使用在 hadoop 配置文件中定義的 schema 和authority, 指定了 Namenode 的 URI。如果路徑不是,Hive 相對(duì)于 /user/ 進(jìn)行解釋。Hive 會(huì)將 filepath 中指定的文件內(nèi)容移動(dòng)到 table (或者 partition)所指定的路徑中。如果使用了 OVERWRITE 關(guān)鍵字,則目標(biāo)表(或者分區(qū))中

34、的內(nèi)容(如果有)會(huì)被刪除,然后再將 filepath 指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。如果目標(biāo)表(分區(qū))已經(jīng)有一個(gè)文件,并且文件名和 filepath 中的文件名件會(huì)被新文件所替代。SELECTSyntaxSELECT ALL | DISTINCT select_expr, select_expr, .FROM table_reference WHERE where_condition GROUP BY col_listCLUSTER BY col_list| DISTRIBUTE BY col_list SORT BY col_listLIMIT number一個(gè) SELECT 語

35、句可以是一個(gè) union 查詢或一個(gè)子查詢的一部分。table_reference 是查詢的輸入,可以是一個(gè)普通表、一個(gè)視圖、一個(gè) join 或一個(gè)子查詢簡單查詢。例如,下面這一語句從 t1 表中查詢所有列的信息。SELECT * FROM t1WHERE Clause,那么現(xiàn)有的文where condition 是一個(gè)表達(dá)式。例如,下面的查詢語句只返回銷售大于 10,且歸屬地屬于的銷售代表。Hive 不支持在 WHERE 子句中的 IN,EXIST 或子查詢。SELECT * FROM sales WHERE amount 10 AND region = USALL and DISTINCT

36、 Clauses使用ALL 和DISTINCT 選項(xiàng)區(qū)分對(duì)重復(fù)的處理。默認(rèn)是ALL,表示查詢所有。DISTINCT表示去掉重復(fù)的。hive SELECT col1, col2 FROM t1 1 31 31 42 5hive SELECT DISTINCT col1, col2 FROM t1 1 31 42 5hive SELECT DISTINCT col1 FROM t1 12基于 Partition 的查詢一般 SELECT 查詢會(huì)掃描整個(gè)表(除非是為了抽樣查詢)。但是如果一個(gè)表使用 PARTITIONED BY 子句建表,查詢就可以利用分區(qū)剪枝(input pruning)的特性,只

37、掃描一個(gè)表中它關(guān)心的那一部分。Hive 當(dāng)前的實(shí)現(xiàn)是,只有分區(qū)斷言出現(xiàn)在離 FROM 子句最近的那個(gè) WHERE 子句中,才會(huì)啟用分區(qū)剪枝。例如,如果 page_views 表使用 date 列分區(qū),以下語句只會(huì)分區(qū)為 2008-03-01的數(shù)據(jù)。SELECT page_views.* FROM page_viewsWHERE page_views.date = 2008-03-01 AND page_views.date 10可以用以下查詢來表達(dá):SELECT col1 FROM (SELECT col1, SUM(col2) AS col2sum FROM t1 GROUP BY col1

38、) t2WHERE t2.col2sum 10LIMIT ClauseLimit 可以限制查詢的數(shù)。查詢的結(jié)果是隨機(jī)選擇的。下面的查詢語句從 t1 表中隨機(jī)查詢5 條:SELECT * FROM t1 LIMIT 5Top k 查詢。下面的查詢語句查詢銷售SET mapred.reduce.tasks = 1最大的 5 個(gè)銷售代表。SELECT * FROM sales SORT BY amount DESC LIMIT 5REGEX Column SpecificationSELECT 語句可以使用正則表達(dá)式做列選擇,下面的語句查詢除了 ds 和 hr 之外的所有列:SELECT (ds|h

39、r)?+.+ FROM sales JoinSyntaxjoin_table:table_reference JOable_factor join_condition| table_reference LEFT|RIGHT|FULL OUTERJOable_reference join_condition| table_reference LEFT SEMI JOINtable_reference join_conditiontable_reference:table_factor| join_tabletable_factor:tbl_name alias| table_subquery a

40、lias| ( table_referen)join_condition:ON equality_expres( AND equality_expres)*equality_expresexpres:= expresHive 只支持等值連接(equality joins)、外連接(outer joins)和(left semi joins?)。Hive 不支持所有非等值的連接,因?yàn)榉堑戎颠B接非常難轉(zhuǎn)化到 map/reduce 任務(wù)。另外,Hive 支持多于 2個(gè)表的連接。寫 join 查詢時(shí),需要注意幾個(gè)關(guān)鍵點(diǎn):只支持等值 join,例如:SELECT a.* FROM a JOIN b ON

41、 (a.id = b.id) SELECT a.* FROM a JOIN bON (a.id = b.id AND a.department = b.department)是正確的,然而:SELECT a.* FROM a JOIN b ON (a.idb.id)是錯(cuò)誤的。可以 join 多于 2 個(gè)表,例如SELECT a.val, b.val, c.val FROM a JOIN bON (a.key = b.key1) JOIN c ON (c.key = b.key2)如果 join 中多個(gè)表的 join key 是同一個(gè),則 join 會(huì)被轉(zhuǎn)化為單個(gè) map/reduce 任務(wù),例

42、如:SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN cON (c.key = b.key1)被轉(zhuǎn)化為單個(gè) map/reduce 任務(wù),因?yàn)?join 中只使用了 b.key1 作為 join key。SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)而這一 join 被轉(zhuǎn)化為 2 個(gè) map/reduce 任務(wù)。因?yàn)?b.key1 用于第一次 join 條件,而 b.key2用于第二次 j

43、oin。join 時(shí),每次 map/reduce 任務(wù)的邏輯是這樣的:reducer 會(huì)緩存 join 序列中除了最后一個(gè)表,再通過最后一個(gè)表將結(jié)果序列化到文件系統(tǒng)。這一實(shí)現(xiàn)有助于在 reduce 端的所有表的減少內(nèi)存的使用量。實(shí)踐中,應(yīng)該把最大的那個(gè)表寫在最后(否則會(huì)因?yàn)榫彺胬速M(fèi)大量內(nèi)存)。例如:SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)所有表都使用同一個(gè) join key(使用 1次 map/reduce 任務(wù)計(jì)算)。Reduce 端會(huì)緩存 a 表和 b就計(jì)算一

44、次 join 結(jié)果,類似的還有:表的,然后每次取得一個(gè) c 表的SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)這里用了 2 次 map/reduce 任務(wù)。第一次緩存 a 表,用 b 表序列化;第二次緩存第一次map/reduce 任務(wù)的結(jié)果,然后用 c 表序列化。LEFT,RIGHT 和 FULL OUTER 關(guān)鍵字用于處理 join 中空的情況,例如:SELECT a.val, b.val FROM a LEFT OUTERJOIN b ON (a.key=b.ke

45、y)對(duì)應(yīng)所有 a 表中的都有一條輸出。輸出的結(jié)果應(yīng)該是 a.val, b.val,當(dāng) a.key=b.key 時(shí),時(shí)也會(huì)輸出 a.val, NULL。“FROM a LEFT OUTER JOIN而當(dāng) b.key 中找不到等值的 a.keyb”這句一定要寫在同一行意思是a 表在 b 表的左邊,所以 a 表中的所有都被保留了;“a RIGHT OUTER JOIN b”會(huì)保留所有 b 表的。OUTER JOIN 語義應(yīng)該是遵循標(biāo)準(zhǔn)SQL spec 的。Join 發(fā)生在 WHERE 子句之前。如果你想限制 join 的輸出,應(yīng)該在 WHERE 子句中寫過濾條件或是在 join 子句中寫。這里面一個(gè)

46、容易SELECT a.val, b.val FROM aLEFT OUTER JOIN b ON (a.key=b.key)WHERE a.ds=2009-07-07 AND b.ds=2009-07-07會(huì) join a 表到 b 表(OUTER JOIN),列出 a.val 和 b.val 的是表分區(qū)的情況:。WHERE 從句中可以使用其他列作為過濾條件。但是,如前所述,如果 b 表中找不到對(duì)應(yīng) a 表的 ,b 表的所有列都會(huì)列出 NULL,包括 ds 列。也就是說,join 會(huì)過濾 b 表中不能找到匹配 a 表 join key 的所有 。這樣的話,LEFT OUTER 就使得查詢結(jié)果與

47、 WHERE 子句無關(guān)了。解決的辦法是在 OUTER JOIN 時(shí)使用以下語法:SELECT a.val, b.val FROM a LEFT OUTER JOIN bON (a.key=b.key AND b.ds=2009-07-07 AND a.ds=2009-07-07)這一查詢的結(jié)果是預(yù)先在RIGHT 和 FULL 類型的joinjoin階段過濾過的,所以不會(huì)存在上述問題。這一邏輯也可以應(yīng)用于中。Join 是不能交換位置的。無論是 LEFT 還是 RIGHT join,都是左連接的。SELECT a.val1, a.val2, b.val, c.val FROM aJOIN b ON

48、 (a.key = b.key)LEFT OUTER JOIN c ON (a.key = c.key)先 join a 表到 b 表,丟棄掉所有join。這一表述有一個(gè)不太明顯join key 中不匹配的,然后用這一中間結(jié)果和 c 表做,就是當(dāng)一個(gè) key 在 a 表和 c 表都存在,但是 b 表中join,即 a JOIN b 的時(shí)候都被丟掉了(包括 a.val1,a.val2不存在的時(shí)候:整個(gè)在第一次和 a.key),然后再和 c 表 join 的時(shí)候,如果 c.key 與 a.key 或 b.key 相等,就會(huì)得到這樣的結(jié)果:NULL, NULL, NULL, c.val。LEFT S

49、EMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實(shí)現(xiàn)。Hive 當(dāng)前沒有實(shí)現(xiàn) IN/EXISTS子查詢,所以你可以用 LEFT SEMI JOIN 重寫你的子查詢語句。LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設(shè)置過濾條件,在 WHERE 子句、SELECT 子句或其他地方過濾都。SELECT a.key, a.value FROM aWHERE a.key in (SELECT b.key FROM B);可以被重寫為:SELECT a.key, a.valFROM a LEFT SEMI JOIN b on (a.key = b.k

50、ey)Hive(五) Hive優(yōu)化Hive 針對(duì)不同的查詢進(jìn)行了優(yōu)化,優(yōu)化可以通過配置進(jìn)行控制,本文將介紹部分優(yōu)化的策略以及優(yōu)化控制選項(xiàng)。列裁剪(Column Pruning)在讀數(shù)據(jù)的時(shí)候,只查詢中需要用到的列,而忽略其他列。例如,對(duì)于查詢:SELECT a,b FROM T WHERE e 10;其中,T 包含 5 個(gè)列 (a,b,c,d,e),列 c,d 將會(huì)被忽略,只會(huì)a, b, e 列這個(gè)選項(xiàng)默認(rèn)為真: hive.optimize.cp = true分區(qū)裁剪(Partition Pruning)在查詢的過程中減少不必要的分區(qū)。例如,對(duì)于下列查詢:SELECT * FROM (SELE

51、CT c1, COUNT(1) FROM T GROUP BY c1) subqWHERE subq.prtn = 100;SELECT * FROM T1 JOIN(SELECT * FROM T2) subq ON (T1.c1=subq.c2) WHERE subq.prtn = 100;會(huì)在子查詢中就考慮 subq.prtn = 100 條件,從而減少讀入的分區(qū)數(shù)目。此選項(xiàng)默認(rèn)為真:hive.optimize.pruner=trueJoin在使用寫有 Join 操作的查詢語句時(shí)有一條原則:應(yīng)該將條目少的表/子查詢放在 Join 操作符的左邊。原因是在 Join 操作的 Reduce 階

52、段,位于 Join 操作符左邊的表的內(nèi)容會(huì)被加載進(jìn)內(nèi)存,將條目少的表放在左邊,可以有效減少發(fā)生 OOM的幾率。錯(cuò)誤對(duì)于一條語句中有多個(gè) Join 的情況,如果 Join 的條件相同,比如查詢:INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.age FROM page_view pJOIN JOINuser u ON (pv.userid = newuser x ON (u.useridu.userid)= x.userid);如果 Join 的 key 相同,不管有多少個(gè)表,都會(huì)則會(huì)合并為一個(gè) Map-Reduce一個(gè) Map-Reduce

53、 任務(wù),而不是 n 個(gè)在做 OUTER JOIN 的時(shí)候也是一樣如果Join 的條件不相同,比如:INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.age FROM page_view p JOIN user u ON (pv.userid = u.userid) JOIN newuser x on (u.age = x.age);Map-Reduce 的任務(wù)數(shù)目和 Join 操作的數(shù)目是對(duì)應(yīng)的,上述查詢和以下查詢是等價(jià)的:INSERT OVERWRITE TABLE tmptableSELECT * FROM page_view p JOI

54、N user u ON (pv.userid = u.userid);INSERT OVERWRITE TABLE pv_usersSELECT x.pageid, x.age FROM tmptable x JOIN newuser y ON (x.age = y.age);Map JoinJoin 操作在 Map 階段完成,不再需要 Reduce,前提條件是需要的數(shù)據(jù)在 Map 的過程中可以到。比如查詢:INSERT OVERWRITE TABLE pv_usersSELECT /*+ MAPJOIN(pv) */ pv.pageid, u.age FROM page_view pvJOI

55、N user u ON (pv.userid = u.userid);可以在 Map 階段完成 Join,:相關(guān)的參數(shù)為:hive.join.emit.erval = 1000 How many rowshe right-most join operand Hive shouldbuffer before emitting the join result.hive.mapjoin.size.key = 10000hive.mapjoin.cache.numrows = 10000Group ByMap 端部分聚合:并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在Map

56、 端進(jìn)行部分聚合,最后在 Reduce 端得出最終結(jié)果?;?Hash參數(shù)包括:hive.map.aggr = true 是否在 Map 端進(jìn)行聚合,默認(rèn)為 Truehive.groupby.mapaggr.check作的條目數(shù)目erval = 100000 在 Map 端進(jìn)行聚合操有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡hive.groupby.skewindata = false當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢計(jì)劃會(huì)有兩個(gè) MR Job。第一個(gè) MR Job 中, Map 的輸出結(jié)果集合會(huì)隨機(jī)分布到 Reduce 中,每個(gè) Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group

57、 By Key 有可能被分發(fā)到不同的 Reduce 中,從而達(dá)到負(fù)載均衡的目的;第二個(gè) MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group By Key 分布到 Reduce 中(這個(gè)過程可以保證相同的Group By Key 被分布到同一個(gè) Reduce 中),最后完成最終的聚合操作。合并小文件文件數(shù)目過多,會(huì)給 HDFS 帶來壓力,并且會(huì)影響處理效率,可以通過合并 Reduce 的結(jié)果文件來消除這樣的影響:Map和hive.merge.mapfiles = true 是否和并 Map 輸出文件,默認(rèn)為 Truehive.merge.mapredfiles = false 是否合并 Red

58、uce 輸出文件,默認(rèn)為 Falsehive.merge.size.per.task = 256*1000*1000 合并文件的大小Hive(六)擴(kuò)展性Hive是一個(gè)很開放的系統(tǒng),很多內(nèi)容都支持用戶定制,包括:文件格式:Text File,Sequence File內(nèi)存中的數(shù)據(jù)格式: Java用戶提供的 map/reduceeger/String, HadoopWritable/Text:不管什么語言,利用 stdin/stdout 傳輸數(shù)據(jù)用戶自定義函數(shù): Substr, Trim, 1 1用戶自定義聚合函數(shù): Sum, Average n 1File FormatCREATE TABLE

59、mylog ( user_id BIG, page_url STRING, unix_time STORED AS TEXTFILE;)當(dāng)用戶的數(shù)據(jù)文件格式不能被當(dāng)前 Hive 所識(shí)別的時(shí)候,可以自定義文件格式??梢詤⒖?contrib/src/java/apache/hadoop/hive/contrib/fileformat/base64中的例子。寫完自定義的格式后,在創(chuàng)建表的時(shí)候指定相應(yīng)的文件格式就可以:TextFileSequenceFIleRCFFileDaypeText OnlyText/BinaryText/Binaryernal Storage OrderRow-basedRo

60、w-basedColumn-basedCompresFiasedBlock BasedBlock BasedSplitableYESYESYESSplitable After CompresNoYESYESCREATE TABase64_test(col1 STRING, col2 STRING) STORED ASINPUTFORMAT .apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormatOUTPUTFORMAT .apache.hadoop.hive.contrib.fileformat.base64.Bas

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論