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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hive内置运算函数,自定义函数(UDF)和Transform

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hive内置运算函数,自定义函数(UDF)和Transform 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4.Hive函數

4.1 內置運算符

內容較多,見《Hive官方文檔》

?

4.2 內置函數

內容較多,見《Hive官方文檔》

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

?

測試各種內置函數的快捷方法:

1、創建一個dual表

create table dual(id string);

2、load一個文件(一行,一個空格)到dual表

hive> load data local inpath'/home/tuzq/software/hivedata/dual.txt' into table dual;

其中dual.txt里面只是一個空格

?

3、select substr('angelababy',2,3) from dual;

?

4.3 Hive自定義函數和Transform

當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF:user-defined function)。

4.3.1 自定義函數類別

UDF? 作用于單個數據行,產生一個數據行作為輸出。(數學函數,字符串函數)

UDAF(用戶定義聚集函數):接收多個輸入數據行,并產生一個輸出數據行。(count,max)

?

4.3.2 UDF開發實例

l? 簡單UDF示例

前期準備,要把hive的lib包導入到工程中,其中UDF依賴的是hive-exec-1.2.1.jar。也就是說要把apache-hive-1.2.1-bin\lib中內容都引入到工程中。若用到hadoop中的一些api,請把hadoop的api也引入進去。

1、先開發一個java類,繼承UDF,并重載evaluate方法

package hiveudf;

?

import org.apache.hadoop.hive.ql.exec.UDF;

import org.apache.hadoop.io.Text;

?

public class ToLowerCase extends UDF {

?

?? public Text evaluate(final Text s) {

????? if(s == null) {return?null;}

????? return?new Text(s.toString().toLowerCase());

?? }

}

?

2、打成jar包上傳到服務器

3、將jar包添加到hive的classpath

4、hive> add jar /home/tuzq/software/hivedata/udf.jar;

Added [/home/tuzq/software/hivedata/udf.jar] to class path

Added resources: [/home/tuzq/software/hivedata/udf.jar]

5、hive>創建臨時函數與開發好的java class關聯

hive> create temporary function toLowercase as 'hiveudf.ToLowerCase';

OK

Time taken: 0.039 seconds

hive>

?

5、即可在hql中使用自定義的函數tolowercase ip?

hive> select toLowercase("TUZUOQUAN") from dual;

OK

tuzuoquan

Time taken: 0.122 seconds, Fetched: 1 row(s)

hive>

?

l? Json數據解析UDF開發

作業:

有原始json數據如下:

{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}

{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}

{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}

{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}

{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}

{"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"}

{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}

?

需要將數據導入到hive數據倉庫中

我不管你中間用幾個表,最終我要得到一個結果表:

movie

rate

timestamp

uid

1197

3

978302268

1

?

?

注:全在hive中完成,可以用自定義函數

?

4.3.3 Transform實現

Hive的 TRANSFORM 關鍵字提供了在SQL中調用自寫腳本的功能

適合實現Hive中沒有的功能又不想寫UDF的情況

?

使用示例1:下面這句sql就是借用了weekday_mapper.py對數據進行了處理.

CREATE TABLE u_data_new (

? movieid INT,

? rating INT,

? weekday INT,

? userid INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t';

?

add FILE weekday_mapper.py;

?

INSERT OVERWRITE TABLE u_data_new

SELECT

? TRANSFORM (movieid , rate, timestring,uid)

? USING 'python weekday_mapper.py'

? AS (movieid, rating, weekday,userid)

FROM t_rating;

?

其中weekday_mapper.py內容如下

#!/bin/python

import sys

import datetime

?

for line in sys.stdin:

? line = line.strip()

? movieid, rating, unixtime,userid = line.split('\t')

? weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

? print '\t'.join([movieid, rating, str(weekday),userid])

?

?

?

總結

以上是生活随笔為你收集整理的Hive内置运算函数,自定义函数(UDF)和Transform的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。