版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Hive(一)Hive 是什么在接觸一個新的事物首先要回到是:這是什么?這里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ù)倉庫基礎構架。它提供了一系列的工具,可以用來進行數(shù)據(jù)提取轉化加載(ETL),這是一種可以在 Hadoop 中的大規(guī)模數(shù)據(jù)的機制。、查詢和分析Hive 定義了簡單的類 SQL 查詢語言,稱為 QL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)。同時,這個語言也允許熟悉 MapReduce 開發(fā)者的開發(fā)自定義的 mapper 和 reducer 來處理內(nèi)建的mapper 和 reducer 無法完成的復雜的分析工作。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的一些基礎文檔:鏡像(被墻
5、): HYPERLINK http:/m/ http:/m頁面:/hiveWiki入門指南:查詢語言指南:演示文稿:藍圖:大多數(shù)有關 Hive 的使用和特性可以從以上的中尋找到。當然,由于 Hive 本身在不斷的發(fā)展中,文檔的更新速度很多時候都趕不上 Hive 本身的更新速度,若希望了解Hive 的動態(tài)或者遇到 Bug,可以加入 Hive 的郵件列表:User: HYPERLINK mailto:hive-userhadoop.apache hive-userhadoop.apache.Developer: HYPERLINK mailto:hive-devhadoop.apache hive
6、-devhadoop.apache.Hive 的配置安裝請參考入門指南, 這里給出最基本的提綱:安裝配置 Hadoop。安裝配置數(shù)據(jù)庫(等)。源獲得Hive碼或者可執(zhí)行代碼。wgettar xzf hive-0.5.0-b cd hive-0.5.0-bin配置 Hive 如何運行 Hive。ar.gzHadoop。數(shù)據(jù)庫,如何當看到 Hive 提示符Hive的時候,恭喜,你可以開始你的 Hive 之旅了。Hive(二)Hive 體系結構Hive 的結構,主要分為以下幾個部分:用戶接口,包括 CLI,Cnt,WUI。元數(shù)據(jù),通常是在關系數(shù)據(jù)庫如, derby 中。解釋器、編譯器、優(yōu)化器、執(zhí)行器
7、。Hadoop:用 HDFS 進行,利用 MapReduce 進行計算。用戶接口主要有三個:CLI,Cnt 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive的時候,需要副本。Cnt 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動 Cnt 模式Hive Server 所在節(jié)點,并且在該節(jié)點啟動 Hive Server。 WUI 是通過瀏覽器HiveHive。將元數(shù)據(jù)、derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和在數(shù)據(jù)庫中,如分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法
8、分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃在 HDFS 中,并在隨后有 MapReduce 調(diào)用執(zhí)行。Hive 的數(shù)據(jù)在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select* from tbl 不會生成 MapRedcue 任務)。HiveHive元數(shù)據(jù)將元數(shù)據(jù)在 RDBMS 中,有三種模式可以連接到數(shù)據(jù)庫:Single User Mode: 此模式連接到一個emory 的數(shù)據(jù)庫 Derby,一般用于 Unit Test。Multi User Mode:通過網(wǎng)絡連接到一個數(shù)據(jù)庫中,是最經(jīng)常使用到的模式。Remote Server Mo
9、de:用于非 Java 客戶端客戶端利用 Thrift 協(xié)議通過 MetaStoreServerMetaStoreServer,元數(shù)據(jù)庫,在服務器端啟動一個元數(shù)據(jù)庫。Hive 的數(shù)據(jù)首先,Hive 沒有專門的數(shù)據(jù)格式,也沒有為數(shù)據(jù)建立索戶可以非常的組織 Hive中的表,只需要在創(chuàng)建表的時候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以據(jù)。數(shù)其次,Hive 中所有的數(shù)據(jù)都Partition,Bucket。在 HDFS 中,Hive 中包含以下數(shù)據(jù)模型:Table,External Table,Hive 中的 Table 和數(shù)據(jù)庫中的 Table 在概念上是類似的,每一個 Table
10、 在 Hive 中都有一個相應的目錄hive-site.xml數(shù)據(jù)。例如,一個表 pvs,它在 HDFS 中的路徑為:/wh/pvs,其中,wh 是在中由 $hive.metastore.warehouse.dir 指定的數(shù)據(jù)倉庫的目錄,所有的 Table 數(shù)據(jù)(不包括 External Table)都保存在這個目錄中。Partition 對應于數(shù)據(jù)庫中的據(jù)庫中的很不相同。在 HivePartition 列的密集索引,但是 Hive 中 Partition 的組織方式和數(shù)中,表中的一個 Partition 對應于表下的一個目錄,所有的 Partition的數(shù)據(jù)都在對應的目錄中。例如:pvs 表
11、中包含 ds 和 city 兩個 Partition,則對應于 ds =20090801, ctry = US 的 HDFS 子目錄為:/wh/pvs/ds=20090801/ctry=US;對應于 ds = 20090801, ctry = CA 的 HDFS 子目錄為;/wh/pvs/ds=20090801/ctry=CABuckets 對指定列計算 hash,根據(jù) hash 值切分數(shù)據(jù),目的是為了并行,每一個 Bucket 對應一個文件。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 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ù)據(jù)的中存在的數(shù)據(jù),可以創(chuàng)建 Partition。它和 Table 在元數(shù)據(jù)的則有較大的差異。Table 的創(chuàng)建過程和數(shù)據(jù)加載過程(這兩個過程可以在同一個語句中完成),在加載數(shù)據(jù)的過程中,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)對刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。將會直接在數(shù)據(jù)倉庫目錄中完成。External Table 只有一個過
13、程, 加載數(shù)據(jù)和創(chuàng)建表同時完成( CREATE EXTERNALTABLE LOCATION),實際數(shù)據(jù)是移動到數(shù)據(jù)倉庫目錄中。在 LOCATION 后面指定的 HDFS 路徑中,并不會Hive(三)摘要:由于 Hive 采用了 SQL 的查詢語言 HQL,因此很容易將 Hive 理解為數(shù)據(jù)庫。其實從結構上來看,Hive 和數(shù)據(jù)庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和數(shù)據(jù)庫的差異。數(shù)據(jù)庫可以用在 Online是Hive 是為數(shù)據(jù)倉庫而設計的,清楚這一點,有助于從應用角度理解的應用中,但Hive 的特性。查詢語言HQLSQLRaw Device 或者 Loca
14、l FS系統(tǒng)決定支持有數(shù)據(jù)位置 HDFS數(shù)據(jù)格式數(shù)據(jù)更新索引執(zhí)行執(zhí)行延遲可擴展性數(shù)據(jù)規(guī)模用戶定義不支持無MapRedcue Executor高高大低低小1.查詢語言。由于SQL 被廣泛的應用在數(shù)據(jù)倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發(fā)的開發(fā)者可以很方便的使用 Hive進行開發(fā)。2.數(shù)據(jù)位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數(shù)據(jù)都是在HDFS 中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設備或者本地文件系統(tǒng)中。3.數(shù)據(jù)格式。Hive 中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個屬性:列分
15、隔符(通常為空格、”t”、”x001)、行分隔符 (”n”) 以及文件數(shù)據(jù)的方法( Hive 中默認有三個文件格式TextFile,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉換,因此,Hive 在加載的過程中不會對數(shù)據(jù)本身進行任何修改,而只是將數(shù)據(jù)內(nèi)容或者移動到相應的 HDFS 目錄中。而在數(shù)據(jù)庫中,不同的數(shù)據(jù)庫有不同的引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會按照一定的組織,因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會比較耗時。 4.數(shù)據(jù)更新。由于 Hive 是針對數(shù)據(jù)倉庫應用設計的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的。因此,Hive
16、 中不支持對數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時候中確定好的。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進行修改的,因此可以使用 INSERTO .VALUES 添加數(shù)據(jù),使用 UPDATE . SET 修改數(shù)據(jù)。5.索引。之前已經(jīng),Hive 在加載數(shù)據(jù)的過程中不會對數(shù)據(jù)進行任何處理,甚至不會對數(shù)據(jù)進行掃描,因此也沒有對數(shù)據(jù)中的某些 Key 建立索引。Hive 要數(shù)據(jù)中滿足條件的特定值時,需要 MapReduce 的引入, Hive 可以并行掃描整個數(shù)據(jù),因此延遲較高。由于數(shù)據(jù),因此即使沒有索引,對于大數(shù)據(jù)量的,Hive 仍然可以體現(xiàn)出優(yōu)勢。數(shù)據(jù)庫中,通常會針對一個或者幾個列建立索引,因此對于少量的
17、特定條件的數(shù)據(jù)的,數(shù)據(jù)庫可以有很高的效率,較低的延遲。由于數(shù)據(jù) 的延遲較高,決定了 Hive 不適合數(shù)據(jù)查詢。執(zhí)行。Hive 中大多數(shù)查詢的執(zhí)行是通過 Hadoop 提供的 MapReduce 來實現(xiàn)的(類似 select * from tbl 的查詢不需要 MapReduce)。而數(shù)據(jù)庫通常有自己的執(zhí)行引擎。執(zhí)行延遲。之前提到,Hive 在查詢數(shù)據(jù)的時候,由于沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執(zhí)行延遲高的是 MapReduce 框架。由于MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執(zhí)行 Hive 查詢時,也會有較高的延遲。相對的,數(shù)據(jù)
18、庫的執(zhí)行延遲較低。當然,這個低是有條件的,即數(shù)據(jù)規(guī)模較小,當數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時 候,Hive 的并行計算顯然能體現(xiàn)出優(yōu)勢。8.可擴展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009 年的規(guī)模在 4000 臺節(jié)點左右)。而數(shù)據(jù)庫由于 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的并行數(shù)據(jù)庫 Oracle 在理論上的擴展能力也只有 100 臺左右。 9.數(shù)據(jù)規(guī)模。由于 Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支
19、持很大規(guī)模的數(shù)據(jù);對應的,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小。Hive(四) HQLHive的文 檔 中 對 查 詢 語 言 有 了 很 詳 細 的 描 述 , 請 參 考 :,本文的內(nèi)容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項。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)建一個指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項來忽略這個異常。EXTERNAL 關鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建表時,會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅數(shù)據(jù)所在的路徑,不
21、對數(shù)據(jù)的位置做任何改變。在刪除表的時候表的元數(shù)據(jù)和數(shù) 據(jù)會被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。LIKE 允許用戶現(xiàn)有的表結構,但是不數(shù)據(jù)。用戶在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的數(shù)據(jù)。如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCE 。
22、有分區(qū)的表可以在創(chuàng)建的時候使用 PARTITIONED BY 語句。一個表可以擁有一個或者多個分區(qū),每一個分區(qū)單獨存在一個目錄下。而且,表和分區(qū)都可以對某個列進行 CLUSTERED BY 操作,將若干個列放入一個桶(bucket)中。也可以利用 SORT BY 對數(shù)據(jù)進行排序。這樣可以為特定應用提高性能。表名和列名不區(qū)分大小寫,SerDe 和屬性名區(qū)分大小寫。表和列的注釋是字符串。Drop Table刪除一個數(shù)據(jù)。 Alter Table表的同時會同時刪除表的元數(shù)據(jù)和數(shù)據(jù)。刪除一個外部表,只刪除元數(shù)據(jù)而保留Alter table 語句允許用戶改變現(xiàn)有表的結構。用戶可以增加列/分區(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 來向一個表中增加分區(qū)。當分區(qū)名是字符串時加引號。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這個命令可以讓用戶為表更名。數(shù)據(jù)所在的位置和分區(qū)名并不改變。換而言之,老的表名并未“釋放”,對老表的更改會改變新表的數(shù)據(jù)。Change Column NamementALTER TABLE table_name CHANGE COLUMNcol_old_name col_new_name column_typeCOMMENTment|AFTER column_name這個命令可以允許用戶修改
26、一個列的名稱、數(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 之后。新的表結構為: bALTER TABLE test_change CHANGE b b1; 會將 b 列的名字修改為 b1, 并將它放在第一列。新表的結構為: b1
27、, a string, c.注意:對列的改變只會修改 Hive 的元數(shù)據(jù),而不會改變實際數(shù)據(jù)。用戶應該確定保證元數(shù)據(jù)定義和實際數(shù)據(jù)結構的一致性。Add/Replace ColumnsALTER TABLE table_name ADD|REPLACECOLUMNS (col_name data_type COMMENTment, .)ADD COLUMNS 允許用戶在當前列的末尾增加新的列,但是在分區(qū)列之前。REPLACE COLUMNS 刪除以后的列,加入新的列。只有在使用 native 的 SerDE(DynamicSerDe or MetadaAlter Table Properties
28、ypeColumnsetSerDe)的時候才可以這么做。ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties: (property_name = property_value, property_name = property_value, . )用戶可以用這個命令向表中增加 metadata,目前 last_modified_user,last_modified_time 屬性都是由 Hive 自動管理的。用戶可以向列表中增加自己的屬性??梢允褂?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, . )這個命令允許用戶向 SerDe 對象增加用戶定義的元數(shù)據(jù)。Hive 為了序列化和反序列化
30、數(shù)據(jù),將會初始化 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這個命令修改了表的物理屬性。Loading fileso table當數(shù)據(jù)被加載至表中時,不會對數(shù)據(jù)進行任何轉換。L
31、oad 操作只是將數(shù)據(jù)對應的位置。Syntax:LOAD DATA LOCAL INPATH filepath OVERWRITEO TABLE tablenamePARTITION (partcol1=val1, partcol2=val2 .)Synopsis:/移動至 Hive表Load 操作只是單純的filepath 可以是:/移動操作,將數(shù)據(jù)文件移動到 Hive 表對應的位置。相對路徑,例如:project/data1絕對路徑,例如: /user/hive/project/data1包含模式的完整 URI,例如:hdfs:/namenode:9000/user/hive/projec
32、t/data1加載的目標可以是一個表或者分區(qū)。如果表包含分區(qū),必須指定每一個分區(qū)的分區(qū)名。filepath 可以一個文件(這種情況下,Hive 會將文件移動到表所對應的目錄中)或者是一個目錄(在這種情況下,Hive 會將目錄中的所有文件移動至表所對應的目錄中)。如果指定了 LOCAL,那么:load 命令會去查找本地文件系統(tǒng)中的 filepath。如果發(fā)現(xiàn)是相對路徑,則路徑會被解釋為相對于當前用戶的當前路徑。用戶也可以為本地文件指定一個完整的 URI ,比如: file:/user/hive/project/data1.load被命令會將 filepath 中的文件到目標文件系統(tǒng)中。目標文件系
33、統(tǒng)由表的位置屬性決定。的數(shù)據(jù)文件移動到表的數(shù)據(jù)對應的位置。如果沒有指定 LOCAL 關鍵字,如果 filepath 指向的是一個完整的 URI,hive 會直接使用這個 URI。 否則:如果沒有指定 schema 或者 authority,Hive 會使用在 hadoop 配置文件中定義的 schema 和authority, 指定了 Namenode 的 URI。如果路徑不是,Hive 相對于 /user/ 進行解釋。Hive 會將 filepath 中指定的文件內(nèi)容移動到 table (或者 partition)所指定的路徑中。如果使用了 OVERWRITE 關鍵字,則目標表(或者分區(qū))中
34、的內(nèi)容(如果有)會被刪除,然后再將 filepath 指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。如果目標表(分區(qū))已經(jīng)有一個文件,并且文件名和 filepath 中的文件名件會被新文件所替代。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一個 SELECT 語
35、句可以是一個 union 查詢或一個子查詢的一部分。table_reference 是查詢的輸入,可以是一個普通表、一個視圖、一個 join 或一個子查詢簡單查詢。例如,下面這一語句從 t1 表中查詢所有列的信息。SELECT * FROM t1WHERE Clause,那么現(xiàn)有的文where condition 是一個表達式。例如,下面的查詢語句只返回銷售大于 10,且歸屬地屬于的銷售代表。Hive 不支持在 WHERE 子句中的 IN,EXIST 或子查詢。SELECT * FROM sales WHERE amount 10 AND region = USALL and DISTINCT
36、 Clauses使用ALL 和DISTINCT 選項區(qū)分對重復的處理。默認是ALL,表示查詢所有。DISTINCT表示去掉重復的。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 查詢會掃描整個表(除非是為了抽樣查詢)。但是如果一個表使用 PARTITIONED BY 子句建表,查詢就可以利用分區(qū)剪枝(input pruning)的特性,只
37、掃描一個表中它關心的那一部分。Hive 當前的實現(xiàn)是,只有分區(qū)斷言出現(xiàn)在離 FROM 子句最近的那個 WHERE 子句中,才會啟用分區(qū)剪枝。例如,如果 page_views 表使用 date 列分區(qū),以下語句只會分區(qū)為 2008-03-01的數(shù)據(jù)。SELECT page_views.* FROM page_viewsWHERE page_views.date = 2008-03-01 AND page_views.date 10可以用以下查詢來表達:SELECT col1 FROM (SELECT col1, SUM(col2) AS col2sum FROM t1 GROUP BY col1
38、) t2WHERE t2.col2sum 10LIMIT ClauseLimit 可以限制查詢的數(shù)。查詢的結果是隨機選擇的。下面的查詢語句從 t1 表中隨機查詢5 條:SELECT * FROM t1 LIMIT 5Top k 查詢。下面的查詢語句查詢銷售SET mapred.reduce.tasks = 1最大的 5 個銷售代表。SELECT * FROM sales SORT BY amount DESC LIMIT 5REGEX Column SpecificationSELECT 語句可以使用正則表達式做列選擇,下面的語句查詢除了 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 不支持所有非等值的連接,因為非等值連接非常難轉化到 map/reduce 任務。另外,Hive 支持多于 2個表的連接。寫 join 查詢時,需要注意幾個關鍵點:只支持等值 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)是錯誤的。可以 join 多于 2 個表,例如SELECT a.val, b.val, c.val FROM a JOIN bON (a.key = b.key1) JOIN c ON (c.key = b.key2)如果 join 中多個表的 join key 是同一個,則 join 會被轉化為單個 map/reduce 任務,例
42、如:SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN cON (c.key = b.key1)被轉化為單個 map/reduce 任務,因為 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 被轉化為 2 個 map/reduce 任務。因為 b.key1 用于第一次 join 條件,而 b.key2用于第二次 j
43、oin。join 時,每次 map/reduce 任務的邏輯是這樣的:reducer 會緩存 join 序列中除了最后一個表,再通過最后一個表將結果序列化到文件系統(tǒng)。這一實現(xiàn)有助于在 reduce 端的所有表的減少內(nè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)所有表都使用同一個 join key(使用 1次 map/reduce 任務計算)。Reduce 端會緩存 a 表和 b就計算一
44、次 join 結果,類似的還有:表的,然后每次取得一個 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 任務。第一次緩存 a 表,用 b 表序列化;第二次緩存第一次map/reduce 任務的結果,然后用 c 表序列化。LEFT,RIGHT 和 FULL OUTER 關鍵字用于處理 join 中空的情況,例如:SELECT a.val, b.val FROM a LEFT OUTERJOIN b ON (a.key=b.ke
45、y)對應所有 a 表中的都有一條輸出。輸出的結果應該是 a.val, b.val,當 a.key=b.key 時,時也會輸出 a.val, NULL?!癋ROM a LEFT OUTER JOIN而當 b.key 中找不到等值的 a.keyb”這句一定要寫在同一行意思是a 表在 b 表的左邊,所以 a 表中的所有都被保留了;“a RIGHT OUTER JOIN b”會保留所有 b 表的。OUTER JOIN 語義應該是遵循標準SQL spec 的。Join 發(fā)生在 WHERE 子句之前。如果你想限制 join 的輸出,應該在 WHERE 子句中寫過濾條件或是在 join 子句中寫。這里面一個
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會 join a 表到 b 表(OUTER JOIN),列出 a.val 和 b.val 的是表分區(qū)的情況:。WHERE 從句中可以使用其他列作為過濾條件。但是,如前所述,如果 b 表中找不到對應 a 表的 ,b 表的所有列都會列出 NULL,包括 ds 列。也就是說,join 會過濾 b 表中不能找到匹配 a 表 join key 的所有 。這樣的話,LEFT OUTER 就使得查詢結果與
47、 WHERE 子句無關了。解決的辦法是在 OUTER JOIN 時使用以下語法: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)這一查詢的結果是預先在RIGHT 和 FULL 類型的joinjoin階段過濾過的,所以不會存在上述問題。這一邏輯也可以應用于中。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。這一表述有一個不太明顯join key 中不匹配的,然后用這一中間結果和 c 表做,就是當一個 key 在 a 表和 c 表都存在,但是 b 表中join,即 a JOIN b 的時候都被丟掉了(包括 a.val1,a.val2不存在的時候:整個在第一次和 a.key),然后再和 c 表 join 的時候,如果 c.key 與 a.key 或 b.key 相等,就會得到這樣的結果:NULL, NULL, NULL, c.val。LEFT S
49、EMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實現(xiàn)。Hive 當前沒有實現(xiàn) IN/EXISTS子查詢,所以你可以用 LEFT SEMI JOIN 重寫你的子查詢語句。LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設置過濾條件,在 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 針對不同的查詢進行了優(yōu)化,優(yōu)化可以通過配置進行控制,本文將介紹部分優(yōu)化的策略以及優(yōu)化控制選項。列裁剪(Column Pruning)在讀數(shù)據(jù)的時候,只查詢中需要用到的列,而忽略其他列。例如,對于查詢:SELECT a,b FROM T WHERE e 10;其中,T 包含 5 個列 (a,b,c,d,e),列 c,d 將會被忽略,只會a, b, e 列這個選項默認為真: hive.optimize.cp = true分區(qū)裁剪(Partition Pruning)在查詢的過程中減少不必要的分區(qū)。例如,對于下列查詢: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;會在子查詢中就考慮 subq.prtn = 100 條件,從而減少讀入的分區(qū)數(shù)目。此選項默認為真:hive.optimize.pruner=trueJoin在使用寫有 Join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 Join 操作符的左邊。原因是在 Join 操作的 Reduce 階
52、段,位于 Join 操作符左邊的表的內(nèi)容會被加載進內(nèi)存,將條目少的表放在左邊,可以有效減少發(fā)生 OOM的幾率。錯誤對于一條語句中有多個 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 相同,不管有多少個表,都會則會合并為一個 Map-Reduce一個 Map-Reduce
53、 任務,而不是 n 個在做 OUTER JOIN 的時候也是一樣如果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 的任務數(shù)目和 Join 操作的數(shù)目是對應的,上述查詢和以下查詢是等價的: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,:相關的參數(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、 端進行部分聚合,最后在 Reduce 端得出最終結果?;?Hash參數(shù)包括:hive.map.aggr = true 是否在 Map 端進行聚合,默認為 Truehive.groupby.mapaggr.check作的條目數(shù)目erval = 100000 在 Map 端進行聚合操有數(shù)據(jù)傾斜的時候進行負載均衡hive.groupby.skewindata = false當選項設定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中, Map 的輸出結果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結果,這樣處理的結果是相同的 Group
57、 By Key 有可能被分發(fā)到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據(jù)預處理的數(shù)據(jù)結果按照 Group By Key 分布到 Reduce 中(這個過程可以保證相同的Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。合并小文件文件數(shù)目過多,會給 HDFS 帶來壓力,并且會影響處理效率,可以通過合并 Reduce 的結果文件來消除這樣的影響:Map和hive.merge.mapfiles = true 是否和并 Map 輸出文件,默認為 Truehive.merge.mapredfiles = false 是否合并 Red
58、uce 輸出文件,默認為 Falsehive.merge.size.per.task = 256*1000*1000 合并文件的大小Hive(六)擴展性Hive是一個很開放的系統(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;)當用戶的數(shù)據(jù)文件格式不能被當前 Hive 所識別的時候,可以自定義文件格式??梢詤⒖?contrib/src/java/apache/hadoop/hive/contrib/fileformat/base64中的例子。寫完自定義的格式后,在創(chuà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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年四川省廣元市利州區(qū)人力資源和社會保障局考試招聘21人高頻重點提升(共500題)附帶答案詳解
- 2025上半年貴州黔南州事業(yè)單位面向應征入伍大學畢業(yè)生招聘72人高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇蘇州昆山市千燈鎮(zhèn)招聘工作人員38人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇建湖縣事業(yè)單位招聘擬聘歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川省眉山市廣播電視臺考試招聘10人高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川瀘州市納溪區(qū)事業(yè)單位招聘工作人員63人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川樂山馬邊縣事業(yè)單位招聘工作人員111人歷年高頻重點提升(共500題)附帶答案詳解
- 工業(yè)園區(qū)土地復墾承諾書
- 通訊網(wǎng)絡建設合同審核流程
- 2024年短期借款協(xié)議模板詳細版版
- Q∕GDW 11311-2021 氣體絕緣金屬封閉開關設備特高頻法局部放電在線監(jiān)測裝置技術規(guī)范
- [玻璃幕墻施工方案]隱框玻璃幕墻施工方案
- 中聯(lián)QY100T汽車吊主臂起重性能表
- 支付寶手持承諾函
- 國航因私免折票系統(tǒng)
- 三相自耦變壓器設計模版
- 國家開放大學電大本科《管理案例分析》2023-2024期末試題及答案(試卷代號:1304)
- 生產(chǎn)安全事故的應急救援預案
- 二面角的求法---三垂線法
- 煤礦井下供電設計課件
- 未婚承諾書模板
評論
0/150
提交評論