閱讀421 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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) {returnnull;}

      returnnew Text(s.toString().toLowerCase());

   }

}

 

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

3、將jar包添加到hive的classpath

4、hive> addJAR /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])

 

 

 

最後更新:2017-06-14 08:55:47

  上一篇:go  日誌采集框架Flume、Flume介紹、概述、運行機製、Flume采集係統結構圖(1、簡單結構、複雜結構)
  下一篇:go  騰訊雲一元服務器搭建個人網站詳細教程