編寫Hive的UDF(查詢平臺數據同時向mysql添加數據)

可能會有一些截圖中會有錯誤提示,是因為本地的包一直包下載有問題,截完圖已經下載好了。

創建包結構

創建一個基礎信息類

所有輸出到mysql數據庫中的自定義MR任務的自定義key均需要實現該抽象類

代碼內容,主要是實現
org.apache.hadoop.io.WritableComparable類,其它不需要寫

創建平臺信息類

創建全局配置常數類

後面慢慢添加內容

繼續完成PlatformInfoKey,添加構造函數

常數類添加信息

根據給定的參數值,構建多個不同維度的平臺維度對象

完成參數驗證

然後構建平臺信息

添加write和readFields方法

創建compareTo方法

添加get/set、hashCode、toString、equals方法,自動生成就可以

創建信息業務接口和實現類

完成接口

添加實現類

創建一個jdbc的管理器

常數類添加數據庫配置

JdbcManager添加jdbc連接

關閉數據庫連接

繼續完成BaseInfoConverterImpl,添加默認構造函數

添加一個緩存數據類型

繼續完成BaseInfoConverterImpl,添加方法創建cache key

創建獲取ID的方法

繼續編寫

添加下面的代碼

補全裡面的sql語句

添加兩個參數

完成getConnection()

完成executeSql

設置參數

添加關閉方法


創建一個UDF,模擬數據庫平臺數據記錄

添加內容

添加evaluate方法

創建一個測試類

創建數據庫

<code>

create

database

report

DROP

TABLE

IF

EXISTS

`platform`

;

CREATE

TABLE

`platform`

(

`id`

int

(

11

)

NOT

NULL

AUTO_INCREMENT

COMMENT

'主鍵id'

,

`platform_name`

varchar

(

45

)

DEFAULT

NULL

COMMENT

'平臺名稱'

,

`platform_version`

varchar

(

10

)

DEFAULT

NULL

COMMENT

'平臺版本'

, PRIMARY

KEY

(

`id`

) )

ENGINE

=

InnoDB

DEFAULT

CHARSET

=utf8 ROW_FORMAT=

COMPACT

COMMENT

=

'平臺信息表'

;/<code>

Sql語句

<code>String querySql = "

SELECT

`id`

FROM

`platform`

WHERE

`platform_name`

= ?

AND

`platform_version`

= ?

order

by

`id`

"; String insertSql = "

INSERT

INTO

`platform`

(

`platform_name`

,

`platform_version`

)

VALUES

(?, ?)

";

/<code>

修改配置:

連接本地數據庫

運行結果

數據庫中

本地測試成功開始打包項目放進集群進行測試

把打包好的jar包改名為hive_udf3.jar放到集群裡

進入MySQL中創建report數據庫

create database report;

創建表platform

進入hive

把jar包添加到hive當中

可以用list jar 和 delete jar 分別顯示jar和刪除jar

創建臨時函數

<code>

create

temporary

function

convert_bl

as

'com.xlgl.wzy.hive.udf.PlatformConverterUDF'

;/<code>

我們可以用show_functions查看函數

我們查看已有表的數據

<code>

select

ename,convert_bl(ename,

0

) lower_name

from

emp;/<code>

這裡報了一個異常

這個問題可能是出在maven給的版本和hive的版本不一樣導致可以替換成自己的版本

然後重新打成jar包運行一下

再查詢一下

<code>

select

ename,convert_bl(ename,

0

) lower_name

from

emp;/<code>

可以在mysql中查看數據