使用Python實現Hive的UDF示例
阿新 • • 發佈:2019-02-18
主要分為兩個部分,一個部分為Python指令碼實現想要實現的功能,另外一個部分為HQL部分,呼叫Python指令碼對資料進行處理。
HQL呼叫Python實現的UDF其實有一個重定向的過程,把資料表中之列的列重定向Python的標準輸入中,按行操作,首先將每行按照指定的分割符分開,一般為’\t’,然後剩下的就是對其進行操作,print需要的列,以’\t’分割。
1、Python實現的UDF程式碼
/Users/nisj/PycharmProjects/EsDataProc/frist_udf.py
2、HQL呼叫UDF
--首先需要新增Python檔案
add file pythonfile_location;
--然後通過transform(指定的列) ,指定的列是需要處理的列
select transform(指定的列)
using "python filename"
as (newname)
--newname指輸出的列的別名
3、幾個說明
add file後面的路徑是Hive客戶端所在的本地檔案路徑,而非Hdfs上的路徑。
UDF函式除錯的時候,可以使用【cat xx.txt|python udf.py】的方式,不用經過Hive客戶端。
Hive傳入python指令碼中的資料,是通過'\t'來分隔的,所以Python指令碼用通過.split('\t')來區分開;有時候,我們結合INSERT OVERWRITE使用上述TRANSFORM,而目標表,其分割副可能不是\t。但是請牢記:TRANSFORM的分割符號,傳入、傳出指令碼的,永遠是\t。
HQL呼叫Python實現的UDF其實有一個重定向的過程,把資料表中之列的列重定向Python的標準輸入中,按行操作,首先將每行按照指定的分割符分開,一般為’\t’,然後剩下的就是對其進行操作,print需要的列,以’\t’分割。
1、Python實現的UDF程式碼
/Users/nisj/PycharmProjects/EsDataProc/frist_udf.py
import sys i = 0 for line in sys.stdin: line = line.strip() i += 1 line = line + " hello udf!" print i,line
2、HQL呼叫UDF
--首先需要新增Python檔案
add file pythonfile_location;
--然後通過transform(指定的列) ,指定的列是需要處理的列
select transform(指定的列)
using "python filename"
as (newname)
--newname指輸出的列的別名
select TRANSFORM(uid,appkey) USING 'python xx_udf.py' as (xx,appkey) from xx_uid_new_fristday_1208 limit 1000; select TRANSFORM(uid,appkey,imei) USING 'python xx_udf.py' as (uid,appkey,imei) from xx_uid_new_fristday_1208 limit 1000; drop table if exists xx_udf_1210;create table xx_udf_1210 as select TRANSFORM(uid,appkey) USING 'python xx_udf.py' as (xx,appkey) from xx_uid_new_fristday_1208 limit 10;
3、幾個說明
add file後面的路徑是Hive客戶端所在的本地檔案路徑,而非Hdfs上的路徑。
UDF函式除錯的時候,可以使用【cat xx.txt|python udf.py】的方式,不用經過Hive客戶端。
Hive傳入python指令碼中的資料,是通過'\t'來分隔的,所以Python指令碼用通過.split('\t')來區分開;有時候,我們結合INSERT OVERWRITE使用上述TRANSFORM,而目標表,其分割副可能不是\t。但是請牢記:TRANSFORM的分割符號,傳入、傳出指令碼的,永遠是\t。