日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出学Hive:Hive高级编程

發(fā)布時(shí)間:2024/1/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出学Hive:Hive高级编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄:

初始Hive

Hive安裝與配置

Hive內(nèi)建操作符與函數(shù)開發(fā)

Hive JDBC

Hive參數(shù)

Hive高級(jí)編程

Hive QL

Hive Shell基本操作

Hive優(yōu)化

Hive體系結(jié)構(gòu)

Hive原理

?

?

?

第一部分:產(chǎn)生背景

產(chǎn)生背景

?為了滿足客戶個(gè)性化的需求,Hive被設(shè)計(jì)成一個(gè)很開放的系統(tǒng),很多內(nèi)容都支持用戶定制,包括:

?文件格式:Text File,Sequence File

?內(nèi)存中的數(shù)據(jù)格式: Java Integer/String, Hadoop? IntWritable/Text

?用戶提供的 map/reduce 腳本:不管什么語言,利用 stdin/stdout 傳輸數(shù)據(jù)

?用戶自定義函數(shù)

自定義函數(shù)

?雖然Hive提供了很多函數(shù),但是有些還是難以滿足我們的需求。因此Hive提供了自定義函數(shù)開發(fā)

?自定義函數(shù)包括三種UDF、UADF、UDTF

?UDF(User-Defined-Function)

?UDAF(User- Defined Aggregation Funcation)

?UDTF(User-Defined Table-Generating Functions)? 用來解決?輸入一行輸出多行(On-to-many maping)?的需求。?

HIVE中使用定義的函數(shù)的三種方式

?在HIVE會(huì)話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function,繼而使用函數(shù)

?在進(jìn)入HIVE會(huì)話之前先自動(dòng)執(zhí)行創(chuàng)建function,不用用戶手工創(chuàng)建

?把自定義的函數(shù)寫到系統(tǒng)函數(shù)中,使之成為HIVE的一個(gè)默認(rèn)函數(shù),這樣就不需要create temporary function

?

第二部分:UDF

UDF用法

?UDF(User-Defined-Function)

?UDF函數(shù)可以直接應(yīng)用于select語句,對(duì)查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容

?編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn)

?自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF

?需要實(shí)現(xiàn)evaluate函數(shù)

?evaluate函數(shù)支持重載

?UDF只能實(shí)現(xiàn)一進(jìn)一出的操作,如果需要實(shí)現(xiàn)多進(jìn)一出,則需要實(shí)現(xiàn)UDAF

UDF用法代碼示例

?

import?org.apache.Hadoop.hive.ql.exec.UDF ??

???public??class?Helloword??extends?UDF{ ??

??????public?String?evaluate(){ ??

???????????return?"hello?world!"; ??

?????} ??

??

??????public?String?evaluate(String?str){ ??

???????????return?"hello?world:?"?+?str; ??

?????} ??

}

開發(fā)步驟

?開發(fā)代碼

?把程序打包放到目標(biāo)機(jī)器上去

?進(jìn)入hive客戶端

?添加jar包:hive>add jar /run/jar/udf_test.jar;

?創(chuàng)建臨時(shí)函數(shù):hive>CREATE TEMPORARY FUNCTION my_add AS 'com.hive.udf.Add ‘

?查詢HQL語句:

?SELECT my_add (8, 9) FROM scores;

?SELECT my_add (scores.math, scores.art) FROM scores;

?銷毀臨時(shí)函數(shù):hive> DROP TEMPORARY FUNCTION my_add ;

?細(xì)節(jié)

?在使用UDF的時(shí)候,會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,例如:?
SELECT my_add (8,9.1) FROM scores;

?結(jié)果是17.1,UDF將類型為Int的參數(shù)轉(zhuǎn)化成double。類型的飲食轉(zhuǎn)換是通過UDFResolver來進(jìn)行控制的

第三部分:UDAF

UDAF

?Hive查詢數(shù)據(jù)時(shí),有些聚類函數(shù)在HQL沒有自帶,需要用戶自定義實(shí)現(xiàn)

?用戶自定義聚合函數(shù): Sum, Average…… n – 1

?UDAF(User- Defined Aggregation Funcation)?

用法

?一下兩個(gè)包是必須的import org.apache.hadoop.hive.ql.exec.UDAF和 org.apache.hadoop.hive.ql.exec.UDAFEvaluator

開發(fā)步驟

?函數(shù)類需要繼承UDAF類,內(nèi)部類Evaluator實(shí)UDAFEvaluator接口

?Evaluator需要實(shí)現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個(gè)函數(shù)

a)init函數(shù)實(shí)現(xiàn)接口UDAFEvaluator的init函數(shù)。

b)iterate接收傳入的參數(shù),并進(jìn)行內(nèi)部的輪轉(zhuǎn)。其返回類型為boolean。

c)terminatePartial無參數(shù),其為iterate函數(shù)輪轉(zhuǎn)結(jié)束后,返回輪轉(zhuǎn)數(shù)據(jù),terminatePartial類似于hadoop的Combiner。

d)merge接收terminatePartial的返回結(jié)果,進(jìn)行數(shù)據(jù)merge操作,其返回類型為boolean。

e)terminate返回最終的聚集函數(shù)結(jié)果。

執(zhí)行步驟

?執(zhí)行求平均數(shù)函數(shù)的步驟

a)將java文件編譯成Avg_test.jar。

b)進(jìn)入hive客戶端添加jar包:

hive>add jar /run/jar/Avg_test.jar。

c)創(chuàng)建臨時(shí)函數(shù):

hive>create temporary function avg_test 'hive.udaf.Avg';

d)查詢語句:

hive>select avg_test(scores.math) from scores;

e)銷毀臨時(shí)函數(shù):

hive>drop temporary function avg_test;

?

UDAF代碼示例

public class MyAvg extends UDAF {

?

public static class AvgEvaluator implements UDAFEvaluator {

}

public void init() {}

public boolean iterate(Double o) {}

public AvgState terminatePartial() {}

public boolean terminatePartial(Double o) {?}

public Double terminate() {}

?

}

第四部分:UDTF

UDTF

?UDTF(User-Defined Table-Generating Functions)? 用來解決?輸入一行輸出多行(On-to-many maping)?的需求。

開發(fā)步驟

?UDTF步驟:

?必須繼承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF

?實(shí)現(xiàn)initialize, process, close三個(gè)方法

?UDTF首先會(huì)

?調(diào)用initialize方法,此方法返回UDTF的返回行的信息(返回個(gè)數(shù),類型)?
初始化完成后,會(huì)調(diào)用process方法,對(duì)傳入的參數(shù)進(jìn)行處理,可以通過forword()方法把結(jié)果返回

?最后close()方法調(diào)用,對(duì)需要清理的方法進(jìn)行清理

使用方法

?UDTF有兩種使用方法,一種直接放到select后面,一種和lateral view一起使用

?直接select中使用:select explode_map(properties) as (col1,col2) from src;

?不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from src

?不可以嵌套調(diào)用:select explode_map(explode_map(properties)) from src

?不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col2

?和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;

此方法更為方便日常使用。執(zhí)行過程相當(dāng)于單獨(dú)執(zhí)行了兩次抽取,然后union到一個(gè)表里。

lateral view

??Lateral View語法

?lateralView:?LATERAL?VIEW?udtf(expression)?tableAlias?AS?columnAlias?(','?columnAlias)*?fromClause:?FROM?baseTable?(lateralView)*??

?

?Lateral View用于UDTF(user-defined table generating functions)中將行轉(zhuǎn)成列,例如explode().

?目前Lateral View不支持有上而下的優(yōu)化。如果使用Where子句,查詢可能將不被編譯。解決方法見:

???? 此時(shí),在查詢之前執(zhí)行set hive.optimize.ppd=false;

?? 例子

?pageAds。它有兩個(gè)列

string pageid

Array<int> adid_list

"?front_page"

[1, 2, 3]

"contact_page?"

[?3, 4, 5]

?SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;

?將輸出如下結(jié)果

string pageid int adid

"front_page" 1

…….

“contact_page" 3

?

代碼示例

public class?MyUDTF?extends GenericUDTF{

public StructObjectInspector initialize(ObjectInspector[]?args)?{}

public void process(Object[] args) throws HiveException {?}

}

實(shí)現(xiàn):切分?”?key:value;key:value;”?這種字符串,?返回結(jié)果為?key, value?兩個(gè)字段

轉(zhuǎn)載請(qǐng)注明出處【?http://sishuok.com/forum/blogPost/list/6226.html】

總結(jié)

以上是生活随笔為你收集整理的深入浅出学Hive:Hive高级编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。