hive實現存儲過程

1、hive存儲過程簡介

1.x版本的hive中沒有提供類似存儲過程的功能,使用Hive做數據開發時候,一般是將一段一段的HQL語句封裝在Shell或者其他腳本中,然後以命令行的方式調用,完成一個業務或者一張報表的統計分析。好消息是,現在已經有了Hive存儲過程的解決方案(HPL/SQL –Procedural SQL on hadoop),並且在未來的Hive的版本(2.0)中,會將該模塊集成進來。該解決方案不僅支持Hive,還支持在SparkSQL,其他NoSQL,甚至是RDBMS中使用類似於Oracle PL/SQL的功能,這將極大的方便數據開發者的工作,Hive中很多之前比較難實現的功能,現在可以很方便的實現,比如自定義變量、基於一個結果集的遊標、循環等等。

2、hplsql安裝和存儲過程案例

下載:

官網下載地址:http://www.hplsql.org/download
0.3.31版本下載地址:http://www.hplsql.org/downloads/hplsql-0.3.31.tar.gz

安裝hplsql:

[root@hadoop01 home]# tar -zxvf /home/hplsql-0.3.31.tar.gz -C /usr/local/


[root@hadoop01 home]# cd /usr/local/hplsql-0.3.31/

配置hplsql:

[root@hadoop01 hplsql-0.3.31]# vi ./hplsql
內容如下:

#!/bin/bash

export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/lib/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_CONF_DIR/"
                                           
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/mapreduce/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/mapreduce/lib/*"
                                                        
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/hdfs/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/hdfs/lib/*"
                                                        
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/yarn/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/yarn/lib/*"

export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/common/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/common/lib/*"
                                                        
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*"
export "HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/conf"

export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"

SCRIPTPATH=${0%/*}

java -cp $SCRIPTPATH:$HADOOP_CLASSPATH:$SCRIPTPATH/hplsql-0.3.31.jar:$SCRIPTPATH/antlr-runtime-4.5.jar $HADOOP_OPTS org.apache.hive.hplsql.Hplsql "$@"

配置hive2的服務:

[root@hadoop01 hive-2.3.6]#vi ./conf/hive-site.xml
追加內容如下:

  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop01</value>
  </property>
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
  </property>
  
重啓hiveserver2:
[root@hadoop01 hive-2.3.6]#nohup hive --service hiveserver2 > hiveserver2.log 2>&1 &

配置HPL/SQL與Hive的連接:

[root@hadoop01 hplsql-0.3.31]# vi ./hplsql-site.xml

在這裏插入圖片描述

使用hplsql -e執行命令:

[root@hadoop01 hplsql-0.3.31]# ./hplsql -e "CURRENT_DATE + 1"
2019-09-18


[root@hadoop01 hplsql-0.3.31]# ./hplsql -e "for i in 1 .. 10 loop print i;end loop;"
1
2
3
4
5
6
7
8
9
10

hplsql -f執行腳本:

測試表:

hive>select * from qf24.u5;
OK
7       yy
3       cc
2       bb

創建腳本hp.sql
create function hello(text string)
returnS string
BEGIN
RETRUEN 'Hello,' || text || '!';
END;

FOR item IN(
SELECT id,name FROM qf24.u5 limit 3
)
loop
        println item.id || '|' || item.name || '|' || hello(item.name);
end loop;


測試:
[root@hadoop01 hplsql-0.3.31]# ./hplsql -f /home/hivedata/hp.sql

7|yy|Hello,yy!
3|cc|Hello,cc!
2|bb|Hello,bb!

創建存儲過程的格式:

use database;
create procedure
begin
......
end;

調用存儲過程:

include path/sp name

call sp name;

案例:

創建存儲過程:
use qf24;
create procedure select_u5()
begin
select * from qf24.u5;
end;

調用:
include 文件路徑   (在代碼文件中引入)

執行執行文件:
[root@hadoop01 hplsql-0.3.31]# ./hplsql -f /home/hivedata/ps.sql

調用指定存儲過程或者方法:
[root@hadoop01 hplsql-0.3.31]# ./hplsql -f /home/hivedata/ps.sql -main select_u5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章