關於在hive中使用python做UDF的總結


主要是利用hive提供的transform語句。

1.編寫python腳本,python腳本數據如下(參考:https://dwgeek.com/hive-udf-using-python-use-python-script-into-hive-example.html/):

#!/usr/bin/python

import sys
try:
    for line in sys.stdin:
        line = line.strip('\n\r')
        fname , lname = line.split('\t')
        firstname = fname.title()
        lastname = lname.title()
        print '\t'.join([firstname, lastname])
except:
    print sys.exc_info()

 

2. 配置python腳本,以讓hive能夠識別到,經測試有兩種方式:

第一種:在hive CLI中增加python腳本,腳本可以放到服務器本地目錄或者hdfs中,依據py腳本所處的位置使用不同的add file語句。

--在服務器本地目錄時
add file initCap.py

--在hdfs時
add file hdfs:///tmp/initCap.py

 由於我們的hive配置了sentry權限控制,經測試只有hive CLI能夠執行add file,用beeline或者其它客戶端的時候會報沒有權限的問題,具體原因還不知道。這種方式需要在每次連接hive都要執行add file的命令,不實用。

 

第二種:使用hive.reloadable.aux.jars.path 的配置參數,然后把py腳本放到對應的目錄中,然后在hive中執行reload 命令,這種方式不需要每次連接都做配置。假設我們配置為:

hive.reloadable.aux.jars.path=/jars/hive/udf/

 

 

3. 在hive sql中使用剛才我們添加的python腳本,示例sql如下:

--在hive CLI中使用add file的情況
select transform('abc\tdef') using 'python initCap.py' as (col_name,khjd);


--使用hive.reloadable.aux.jars.path配置參數的情況
select transform('abc\tdef') using '/jars/hive/udf/initCap.py' as (col_name,khjd);

 

 

經測試,當使用mr作為執行引擎的時候以上方式可以正確調用py。但是使用spark作為執行引擎的時候會報錯,原因暫時未知。

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM