| 1.1 Hive簡(jiǎn)介1.1.1 什么是HiveHive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能。 1.1.2 為什么使用Hive
 人員學(xué)習(xí)成本太高 項(xiàng)目周期要求太短 MapReduce實(shí)現(xiàn)復(fù)雜查詢邏輯開發(fā)難度太大 
 
 操作接口采用類SQL語法,提供快速開發(fā)的能力。 避免了去寫MapReduce,減少開發(fā)人員的學(xué)習(xí)成本。 擴(kuò)展功能很方便。 1.1.3 Hive的特點(diǎn)
 Hive可以自由的擴(kuò)展集群的規(guī)模,一般情況下不需要重啟服務(wù)。 
 
 Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來實(shí)現(xiàn)自己的函數(shù)。 
 
 良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問題SQL仍可完成執(zhí)行。 1.2 Hive架構(gòu)1.2.1 架構(gòu)圖  
 Jobtracker是hadoop1.x中的組件,它的功能相當(dāng)于: Resourcemanager+AppMaster 
 TaskTracker 相當(dāng)于: Nodemanager + yarnchild 
 
 
 
 1.2.2 基本組成
 1.2.3 各組件的基本功能1.3 Hive與Hadoop的關(guān)系Hive利用HDFS存儲(chǔ)數(shù)據(jù),利用MapReduce查詢數(shù)據(jù) 
   
 
 1.4 Hive與傳統(tǒng)數(shù)據(jù)庫對(duì)比
   
 總結(jié):hive具有sql數(shù)據(jù)庫的外表,但應(yīng)用場(chǎng)景完全不同,hive只適合用來做批量數(shù)據(jù)統(tǒng)計(jì)分析 1.5 Hive的數(shù)據(jù)存儲(chǔ)1、Hive中所有的數(shù)據(jù)都存儲(chǔ)在 HDFS 中,沒有專門的數(shù)據(jù)存儲(chǔ)格式(可支持Text,SequenceFile,ParquetFile,RCFILE等) 2、只需要在創(chuàng)建表的時(shí)候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以解析數(shù)據(jù)。 3、Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket。 2 db:在hdfs中表現(xiàn)為${hive.metastore.warehouse.dir}目錄下一個(gè)文件夾 2 table:在hdfs中表現(xiàn)所屬db目錄下一個(gè)文件夾 2 external table:與table類似,不過其數(shù)據(jù)存放位置可以在任意指定路徑 2 partition:在hdfs中表現(xiàn)為table目錄下的子目錄 2 bucket:在hdfs中表現(xiàn)為同一個(gè)表目錄下根據(jù)hash散列之后的多個(gè)文件 
 
 1.6 HIVE的安裝部署1.6.1 安裝單機(jī)版: 元數(shù)據(jù)庫mysql版: 
 1.6.2 使用方式Hive交互shellbin/hive 
 
 Hive thrift服務(wù)  
 啟動(dòng)方式,(假如是在hadoop01上): 啟動(dòng)為前臺(tái):bin/hiveserver2 啟動(dòng)為后臺(tái):nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & 
 啟動(dòng)成功后,可以在別的節(jié)點(diǎn)上用beeline去連接 v 方式(1) hive/bin/beeline 回車,進(jìn)入beeline的命令界面 輸入命令連接hiveserver2 beeline> !connect jdbc:hive2//mini1:10000 (hadoop01是hiveserver2所啟動(dòng)的那臺(tái)主機(jī)名,端口默認(rèn)是10000) v 方式(2) 或者啟動(dòng)就連接: bin/beeline -u jdbc:hive2://mini1:10000 -n hadoop 
 接下來就可以做正常sql查詢了 
 
 Hive命令[hadoop@hdp-node-02 ~]$ hive -e 'sql’ 
 
 2. Hive基本操作2.1 DDL操作2.1.1 創(chuàng)建表建表語法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] 
 說明: 1、 CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項(xiàng)來忽略這個(gè)異常。 2、 EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。 3、 LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。 4、 ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 用戶在建表的時(shí)候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive通過 SerDe 確定表的具體的列的數(shù)據(jù)。 5、 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE 如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCEFILE。 
 6、CLUSTERED BY 對(duì)于每一個(gè)表(table)或者分區(qū), Hive可以進(jìn)一步組織成桶,也就是說桶是更為細(xì)粒度的數(shù)據(jù)范圍劃分。Hive也是 針對(duì)某一列進(jìn)行桶的組織。Hive采用對(duì)列值哈希,然后除以桶的個(gè)數(shù)求余的方式?jīng)Q定該條記錄存放在哪個(gè)桶當(dāng)中。 把表(或者分區(qū))組織成桶(Bucket)有兩個(gè)理由: (1)獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時(shí)能利用這個(gè)結(jié)構(gòu)。具體而言,連接兩個(gè)在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實(shí)現(xiàn)。比如JOIN操作。對(duì)于JOIN操作兩個(gè)表有一個(gè)相同的列,如果對(duì)這兩個(gè)表都進(jìn)行了桶操作。那么將保存相同列值的桶進(jìn)行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。 (2)使取樣(sampling)更高效。在處理大規(guī)模數(shù)據(jù)集時(shí),在開發(fā)和修改查詢的階段,如果能在數(shù)據(jù)集的一小部分?jǐn)?shù)據(jù)上試運(yùn)行查詢,會(huì)帶來很多方便。 
 
 具體實(shí)例1、 創(chuàng)建內(nèi)部表mytable。   
 
 2、 創(chuàng)建外部表pageview。 
   
 3、 創(chuàng)建分區(qū)表invites。 
 
   
 
 4、 創(chuàng)建帶桶的表student。   
 2.1.2 修改表增加/刪除分區(qū)ü 語法結(jié)構(gòu) ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...) 
 ALTER TABLE table_name DROP partition_spec, partition_spec,... ü 具體實(shí)例 
 
   
 重命名表ü 語法結(jié)構(gòu) ALTER TABLE table_name RENAME TO new_table_name ü 具體實(shí)例   
 增加/更新列ü 語法結(jié)構(gòu) ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 
 注:ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE則是表示替換表中所有字段。 
 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] ü 具體實(shí)例   
 2.1.3 顯示命令show tables show databases show partitions show functions desc extended t_name; desc formatted table_name; 2.2 DML操作2.2.1 Load語法結(jié)構(gòu) LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] 
 說明: 1、 Load 操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到 Hive 表對(duì)應(yīng)的位置。 2、 filepath: 相對(duì)路徑,例如:project/data1 絕對(duì)路徑,例如:/user/hive/project/data1 包含模式的完整 URI,列如: hdfs://namenode:9000/user/hive/project/data1 3、 LOCAL關(guān)鍵字 如果指定了 LOCAL, load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。 如果沒有指定 LOCAL 關(guān)鍵字,則根據(jù)inpath中的uri 
 如果指定了 LOCAL,那么: load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。如果發(fā)現(xiàn)是相對(duì)路徑,則路徑會(huì)被解釋為相對(duì)于當(dāng)前用戶的當(dāng)前路徑。 load 命令會(huì)將 filepath中的文件復(fù)制到目標(biāo)文件系統(tǒng)中。目標(biāo)文件系統(tǒng)由表的位置屬性決定。被復(fù)制的數(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,fs.default.name 指定了 Namenode 的 URI。 如果路徑不是絕對(duì)的,Hive 相對(duì)于/user/進(jìn)行解釋。 Hive 會(huì)將 filepath 中指定的文件內(nèi)容移動(dòng)到 table (或者 partition)所指定的路徑中。 
 4、 OVERWRITE 關(guān)鍵字 如果使用了 OVERWRITE 關(guān)鍵字,則目標(biāo)表(或者分區(qū))中的內(nèi)容會(huì)被刪除,然后再將 filepath 指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。 如果目標(biāo)表(分區(qū))已經(jīng)有一個(gè)文件,并且文件名和 filepath 中的文件名沖突,那么現(xiàn)有的文件會(huì)被新文件所替代。 
 具體實(shí)例 1、 加載相對(duì)路徑數(shù)據(jù)。   
 
 2、 加載絕對(duì)路徑數(shù)據(jù)。   
 
 3、 加載包含模式數(shù)據(jù)。 
   
 4、 OVERWRITE關(guān)鍵字使用。   
 2.2.2 Insert將查詢結(jié)果插入Hive表 ü 語法結(jié)構(gòu) INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement 
 Multiple inserts: FROM from_statement INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ... 
 Dynamic partition inserts: INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement 
 ü 具體實(shí)例 1、基本模式插入。 
   
 
 2、多插入模式。   
 
 3、自動(dòng)分區(qū)模式。 
   
 v 導(dǎo)出表數(shù)據(jù) ü 語法結(jié)構(gòu) INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ... 
 
 multiple inserts: FROM from_statement INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1 [INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ... 
 ü 具體實(shí)例 1、導(dǎo)出文件到本地。 
   
 說明: 數(shù)據(jù)寫入到文件系統(tǒng)時(shí)進(jìn)行文本序列化,且每列用^A來區(qū)分,\n為換行符。用more命令查看時(shí)不容易看出分割符,可以使用: sed -e 's/\x01/|/g' filename[dht3] 來查看。 
 2、導(dǎo)出數(shù)據(jù)到HDFS。   
 2.2.3 SELECT基本的Select操作 ü 語法結(jié)構(gòu) SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list [HAVING condition]] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] ] [LIMIT number] 
 注:1、order by 會(huì)對(duì)輸入做全局排序,因此只有一個(gè)reducer,會(huì)導(dǎo)致當(dāng)輸入規(guī)模較大時(shí),需要較長(zhǎng)的計(jì)算時(shí)間。 2、sort by不是全局排序,其在數(shù)據(jù)進(jìn)入reducer前完成排序。因此,如果用sort by進(jìn)行排序,并且設(shè)置mapred.reduce.tasks>1,則sort by只保證每個(gè)reducer的輸出有序,不保證全局有序。 3、distribute by(字段)根據(jù)指定的字段將數(shù)據(jù)分到不同的reducer,且分發(fā)算法是hash散列。 4、Cluster by(字段)除了具有Distribute by的功能外,還會(huì)對(duì)該字段進(jìn)行排序。 
 
 因此,如果分桶和sort字段是同一個(gè)時(shí),此時(shí),cluster by = distribute by + sort by 
 分桶表的作用:最大的作用是用來提高join操作的效率; (思考這個(gè)問題: select a.id,a.name,b.addr from a join b on a.id = b.id; 如果a表和b表已經(jīng)是分桶表,而且分桶的字段是id字段 做這個(gè)join操作時(shí),還需要全表做笛卡爾積嗎?) 
 
 
 
 ü 具體實(shí)例 1、獲取年齡大的3個(gè)學(xué)生。   
 
 2、查詢學(xué)生信息按年齡,降序排序。 
   
 
     
 3、按學(xué)生名稱匯總學(xué)生年齡。 
   
 
 2.3 Hive Join語法結(jié)構(gòu) join_table: table_reference JOIN table_factor [join_condition] | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition | table_reference LEFT SEMI JOIN table_reference join_condition Hive 支持等值連接(equality joins)、外連接(outer joins)和(left/right joins)。Hive 不支持非等值的連接,因?yàn)榉堑戎颠B接非常難轉(zhuǎn)化到 map/reduce 任務(wù)。 另外,Hive 支持多于 2 個(gè)表的連接。 寫 join 查詢時(shí),需要注意幾個(gè)關(guān)鍵點(diǎn): 1. 只支持等值join 例如: SELECT a.* FROM a JOIN b ON (a.id = b.id) SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department) 是正確的,然而: SELECT a.* FROM a JOIN b ON (a.id>b.id) 是錯(cuò)誤的。 
 2. 可以 join 多于 2 個(gè)表。 例如 SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) 如果join中多個(gè)表的 join key 是同一個(gè),則 join 會(huì)被轉(zhuǎn)化為單個(gè) map/reduce 任務(wù),例如: SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (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 用于第二次 join。 
 3.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)大量?jī)?nèi)存)。例如: SELECT a.val, b.val, c.val FROM a JOIN 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 表的記錄,然后每次取得一個(gè) c 表的記錄就計(jì)算一次 join 結(jié)果,類似的還有: SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) 這里用了 2 次 map/reduce 任務(wù)。第一次緩存 a 表,用 b 表序列化;第二次緩存第一次 map/reduce 任務(wù)的結(jié)果,然后用 c 表序列化。 
 4.LEFT,RIGHT 和 FULL OUTER 關(guān)鍵字用于處理 join 中空記錄的情況 例如: SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) 對(duì)應(yīng)所有 a 表中的記錄都有一條記錄輸出。輸出的結(jié)果應(yīng)該是 a.val, b.val,當(dāng) a.key=b.key 時(shí),而當(dāng) b.key 中找不到等值的 a.key 記錄時(shí)也會(huì)輸出: a.val, NULL 所以 a 表中的所有記錄都被保留了; “a RIGHT OUTER JOIN b”會(huì)保留所有 b 表的記錄。 
 Join 發(fā)生在 WHERE 子句之前。如果你想限制 join 的輸出,應(yīng)該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫。這里面一個(gè)容易混淆的問題是表分區(qū)的情況: SELECT a.val, b.val FROM a LEFT 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 的記錄。WHERE 從句中可以使用其他列作為過濾條件。但是,如前所述,如果 b 表中找不到對(duì)應(yīng) a 表的記錄,b 表的所有列都會(huì)列出 NULL,包括 ds 列。也就是說,join 會(huì)過濾 b 表中不能找到匹配 a 表 join key 的所有記錄。這樣的話,LEFT OUTER 就使得查詢結(jié)果與 WHERE 子句無關(guān)了。解決的辦法是在 OUTER JOIN 時(shí)使用以下語法: SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07') 這一查詢的結(jié)果是預(yù)先在 join 階段過濾過的,所以不會(huì)存在上述問題。這一邏輯也可以應(yīng)用于 RIGHT 和 FULL 類型的 join 中。 
 Join 是不能交換位置的。無論是 LEFT 還是 RIGHT join,都是左連接的。 SELECT a.val1, a.val2, b.val, c.val FROM a JOIN b ON (a.key = b.key) LEFT OUTER JOIN c ON (a.key = c.key) 先 join a 表到 b 表,丟棄掉所有 join key 中不匹配的記錄,然后用這一中間結(jié)果和 c 表做 join。這一表述有一個(gè)不太明顯的問題,就是當(dāng)一個(gè) key 在 a 表和 c 表都存在,但是 b 表中不存在的時(shí)候:整個(gè)記錄在第一次 join,即 a JOIN b 的時(shí)候都被丟掉了(包括a.val1,a.val2和a.key),然后我們?cè)俸?c 表 join 的時(shí)候,如果 c.key 與 a.key 或 b.key 相等,就會(huì)得到這樣的結(jié)果:NULL, NULL, NULL, c.val 
 具體實(shí)例 1、 獲取已經(jīng)分配班級(jí)的學(xué)生姓名。   
 
 2、 獲取尚未分配班級(jí)的學(xué)生姓名。 
   
 3、 LEFT SEMI JOIN是IN/EXISTS的高效實(shí)現(xiàn)。 
   
 
 3 Hive Shell參數(shù)3.1 Hive命令行語法結(jié)構(gòu) hive [-hiveconf x=y]* [<-i filename>]* [<-f filename>|<-e query-string>] [-S] 說明: 1、 -i 從文件初始化HQL。 2、 -e從命令行執(zhí)行指定的HQL 3、 -f 執(zhí)行HQL腳本 4、 -v 輸出執(zhí)行的HQL語句到控制臺(tái) 5、 -p <port> connect to Hive Server on port number 6、 -hiveconf x=y Use this to set hive/hadoop configuration variables. 具體實(shí)例 1、運(yùn)行一個(gè)查詢。   
 
 2、運(yùn)行一個(gè)文件。   
 
 3、運(yùn)行參數(shù)文件。 
   
 
 3.2 Hive參數(shù)配置方式Hive參數(shù)大全: https://cwiki./confluence/display/Hive/Configuration+Properties 
 開發(fā)Hive應(yīng)用時(shí),不可避免地需要設(shè)定Hive的參數(shù)。設(shè)定Hive的參數(shù)可以調(diào)優(yōu)HQL代碼的執(zhí)行效率,或幫助定位問題。然而實(shí)踐中經(jīng)常遇到的一個(gè)問題是,為什么設(shè)定的參數(shù)沒有起作用?這通常是錯(cuò)誤的設(shè)定方式導(dǎo)致的。 
 對(duì)于一般參數(shù),有以下三種設(shè)定方式: l 配置文件 l 命令行參數(shù) l 參數(shù)聲明 
 配置文件:Hive的配置文件包括 l 用戶自定義配置文件:$HIVE_CONF_DIR/hive-site.xml l 默認(rèn)配置文件:$HIVE_CONF_DIR/hive-default.xml 用戶自定義配置會(huì)覆蓋默認(rèn)配置。 另外,Hive也會(huì)讀入Hadoop的配置,因?yàn)镠ive是作為Hadoop的客戶端啟動(dòng)的,Hive的配置會(huì)覆蓋Hadoop的配置。 配置文件的設(shè)定對(duì)本機(jī)啟動(dòng)的所有Hive進(jìn)程都有效。 
 命令行參數(shù):?jiǎn)?dòng)Hive(客戶端或Server方式)時(shí),可以在命令行添加-hiveconf param=value來設(shè)定參數(shù),例如: bin/hive -hiveconf hive.root.logger=INFO,console 這一設(shè)定對(duì)本次啟動(dòng)的Session(對(duì)于Server方式啟動(dòng),則是所有請(qǐng)求的Sessions)有效。 
 參數(shù)聲明:可以在HQL中使用SET關(guān)鍵字設(shè)定參數(shù),例如: set mapred.reduce.tasks=100; 這一設(shè)定的作用域也是session級(jí)的。 
 上述三種設(shè)定方式的優(yōu)先級(jí)依次遞增。即參數(shù)聲明覆蓋命令行參數(shù),命令行參數(shù)覆蓋配置文件設(shè)定。注意某些系統(tǒng)級(jí)的參數(shù),例如log4j相關(guān)的設(shè)定,必須用前兩種方式設(shè)定,因?yàn)槟切﹨?shù)的讀取在Session建立以前已經(jīng)完成了。 
 
 
 4. Hive函數(shù)4.1 內(nèi)置運(yùn)算符內(nèi)容較多,見《Hive官方文檔》 
 4.2 內(nèi)置函數(shù)內(nèi)容較多,見《Hive官方文檔》 (比如String 的 length substring replace 等) https://cwiki./confluence/display/Hive/LanguageManual+UDF 
 測(cè)試各種內(nèi)置函數(shù)的快捷方法: 1、創(chuàng)建一個(gè)dual表 create table dual(id string); 2、load一個(gè)文件(一行,一個(gè)空格)到dual表 3、select substr('angelababy',2,3) from dual; 
 
 
 4.3 Hive自定義函數(shù)和Transform當(dāng)Hive提供的內(nèi)置函數(shù)無法滿足你的業(yè)務(wù)處理需要時(shí),此時(shí)就可以考慮使用用戶自定義函數(shù)(UDF:user-defined function)。 4.3.1 自定義函數(shù)類別UDF 作用于單個(gè)數(shù)據(jù)行,產(chǎn)生一個(gè)數(shù)據(jù)行作為輸出。(數(shù)學(xué)函數(shù),字符串函數(shù)) UDAF(用戶定義聚集函數(shù)):接收多個(gè)輸入數(shù)據(jù)行,并產(chǎn)生一個(gè)輸出數(shù)據(jù)行。(count,max) 
 4.3.2 UDF開發(fā)實(shí)例l 簡(jiǎn)單UDF示例 1、先開發(fā)一個(gè)java類,繼承UDF,并重載evaluate方法 
 
 2、打成jar包上傳到服務(wù)器 3、將jar包添加到hive的classpath hive>add JAR /home/hadoop/udf.jar; 4、創(chuàng)建臨時(shí)函數(shù)與開發(fā)好的java class關(guān)聯(lián) 
 
 5、即可在hql中使用自定義的函數(shù)tolowercase Select tolowercase(name) fromt_text; l Json數(shù)據(jù)解析UDF開發(fā) 
 
 
 
 4.3.3 Transform實(shí)現(xiàn)Hive的 TRANSFORM 關(guān)鍵字提供了在SQL中調(diào)用自寫腳本的功能 適合實(shí)現(xiàn)Hive中沒有的功能又不想寫UDF的情況 
 使用示例1:下面這句sql就是借用了weekday_mapper.py對(duì)數(shù)據(jù)進(jìn)行了處理. 
 
 其中weekday_mapper.py內(nèi)容如下 
 
 
 
 
 | 
|  |