主要是利用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作為執行引擎的時候會報錯,原因暫時未知。
以上。
