從mysql的存儲過程到hive的存儲過程

mysql的存儲過程

在mysql中的聲明字段:
使用關鍵字:declare
普通類型申明格式如下:
Decalare 字段名 字段類型(位數)  [default 默認值];
如:declare name varchar(45) default ‘’;

在mysql中的賦值:
使用關鍵字:set
如: Set i =100;

在mysql中判斷常用的是if...end if  、if...else... 和 if...else if...else...等。
這幾個的if else語句格式:(控制條件用可以and或者or)
If 控制條件 then
判斷體; //每一句用分號結束,
End if;

If 控制條件 then
判斷體; //每一句用分號結束
Else
判斷體; //每一句用分號結束
End if;

If 控制條件 then
判斷體; //每一句用分號結束
Elseif 控制條件   //注意Elseif不能分開 
判斷體; //每一句用分號結束
Else
判斷體; //每一句用分號結束
End if;

循環實例

While循環:
BEGIN
/*
*/
DECLARE count INT(11);
DECLARE i INT(11);
DECLARE userName VARCHAR(45);
DECLARE age INT(2);

SET count = 10;
SET i =0;
WHILE i < count DO
SET userName = CONCAT('1510A',i);
SET age = ROUND(ROUND(RAND(),2)*100,2);
INSERT INTO `USER`(`NAME`,age) VALUES (userName,age);
SET i = i+1;
END WHILE;
END
Repeat的循環:
BEGIN
/*
*/
DECLARE count INT(11);
DECLARE i INT(11);
DECLARE userName VARCHAR(45);
DECLARE age INT(2);
SET count = 10;
SET i =0;

REPEAT
SET userName = CONCAT('1510A12',i);
SET age = ROUND(ROUND(RAND(),2)*100,2);
INSERT INTO `USER`(`NAME`,age) VALUES (userName,age);
SET i = i+1;
UNTIL i > count
END REPEAT;
End

遊標定義

在mysql中的遊標,遊標相當於咱們編程中的動態數組。
遊標類型申明格式:
Delcare 遊標名稱 cursor for
Select 被查詢字段名 from 表名 where條件;
定義sql異常標記_done ;
Open 遊標名稱;
Repeat
Fetch 遊標名稱 into 新字段名;
循環體;
Utile sql異常標記_done 
End repeat;
Close 遊標名稱;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
START TRANSACTION;
IF t_error = 1 THEN
	ROLLBACK;
ELSE
	COMMIT;
END IF;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;#錯誤定義,標記循環結束 

#循環遊標
OPEN stu_set;
     /* 循環執行    */ 
		 REPEAT
				FETCH stu_set INTO _id,_nm;  
			 IF NOT _done THEN
				INSERT INTO  test.`USER`(`NAME`,age) VALUES (_nm,_id);
				END IF;
		UNTIL _done END REPEAT; #當_done=1時退出被循  
CLOSE stu_set;


END

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中很 多之前比較難實現的功能,現在可以很方便的實現,比如自定義變量、基於一個結果集的遊標、循環等等。

hplsql安裝

安裝hplsql:
配置hplsql:
1.x版本的hive中沒有提供類似存儲過程的功能,使用Hive做數據開發時候,一般是將一段一段的HQL語句封 裝在Shell或者其他腳本中,然後以命令行的方式調用,完成一個業務或者一張報表的統計分析。好消息是, 現在已經有了Hive存儲過程的解決方案(HPL/SQL –Procedural SQL on hadoop),並且在未來的 Hive的版本(2.0)中,會將該模塊集成進來。該解決方案不僅支持Hive,還支持在SparkSQL,其他 NoSQL,甚至是RDBMS中使用類似於Oracle PL/SQL的功能,這將極大的方便數據開發者的工作,Hive中很 多之前比較難實現的功能,現在可以很方便的實現,比如自定義變量、基於一個結果集的遊標、循環等等。
官網下載地址:http://www.hplsql.org/download 0.3.31版本下載地址:http://www.hplsql.org/downloads/hplsql-0.3.31.tar.gz
[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/
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/*"
配置hive2的服務:
配置HPL/SQL與Hive的連接:
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/hplsql0.3.31.jar:$SCRIPTPATH/antlr-runtime-4.5.jar $HADOOP_OPTS org.apache.hive.hplsql.Hplsql "$@"

<configuration>
<property>
<!--默認連接-->
<name>hplsql.conn.default</name>
<value>hive2conn</value>
<description>Thedefaultconnectionprofile</description>
</property>
<property>
<name>hplsql.conn.hiveconn</name>
<value>org.apache.hive.jdbc.HiveDriver;jdbc:hive2://</value>
<description>HiveServer2JDBCconnection(embeddedmode)</description>
</property>
<property>
<name>hplsql.conn.init.hiveconn</name>
<value>
set mapred.job.queue.name=default;
set hive.execution.engine=mr;
use default;
</value>
<description>Statementsforexecuteafterconnectiontothedatabase</description>
</property>
<property>
<name>hplsql.conn.convert.hiveconn</name>
<value>true</value>
<description>ConvertSQLstatementsbeforeexecution</description>
</property>
<property>
<name>hplsql.conn.hive1conn</name>
<value>org.apache.hadoop.hive.jdbc.HiveDriver;jdbc:hive://</value>
<description>HiveembeddedJDBC(notrequiringHiveServer)</description>
</property>
<!--Hive連接配置>
<property>
<name>hplsql.conn.hive2conn</name>
<value>org.apache.hive.jdbc.HiveDriver;jdbc:hive2://hadoop-01:10000;root;root</value>
<description>HiveServer2JDBCconnection</description>
</property>
<property>
<name>hplsql.conn.init.hive2conn</name>
<value>
setmapred.job.queue.name=hive;
sethive.execution.engine=hive;
usehive;
</value>
<description>Statementsforexecuteafterconnectiontothedatabase</description>
</property>
<property>
<name>hplsql.conn.convert.hive2conn</name>
<value>true</value>
<description>ConvertSQLstatementsbeforeexecution</description>
</property>
<property>
<name>hplsql.conn.db2conn</name>
<value>com.ibm.db2.jcc.DB2Driver;jdbc:db2://localhost:50001/dbname;user;password</value>
<description>IBMDB2connection</description>
</property>
<property>
<name>hplsql.conn.tdconn</name>
<value>com.teradata.jdbc.TeraDriver;jdbc:teradata://localhost/database=dbname,logmech=ldap;user;password</value>

<description>Teradataconnection</description>
</property>
<property>
<name>hplsql.conn.mysqlconn</name>
<value>com.mysql.jdbc.Driver;jdbc:mysql://localhost/imooc;root;root</value>

<description>MySQLconnection</description>

</property>
<property>

<name>hplsql.dual.table</name>

<value></value>

<description>Singlerow,singlecolumntableforinternaloperations</description>

</property>


<property>

<name>hplsql.insert.values</name>

<value>native</value>

<description>HowtoexecuteINSERTVALUESstatement:native(default)andselect</description>

</property>


<property>

<name>hplsql.onerror</name>

<value>exception</value>

<description>Errorhandlingbehavior:exception(default),seterrorandstop</description>

</property>


<property>

<name>hplsql.temp.tables</name>

<value>native</value>

<description>Temporarytables:native(default)andmanaged</description>

</property>


<property>

<name>hplsql.temp.tables.schema</name>

<value></value>

<description>Schemaformanagedtemporarytables</description>

</property>
<property>

<name>hplsql.temp.tables.location</name>

<value>/tmp/plhql</value>

<description>LOcationformanagedtemporarytablesinHDFS</description>
</property>
</configuration>

案例

CREATE PROCEDURE set_message(IN name STRING, OUT result STRING)
BEGIN
 SET result = 'Hello, ' || name || '!';
END;
 
-- Now call the procedure and print the results
DECLARE str STRING;
CALL set_message('world', str);
PRINT str;
 
Result:
--
Hello, world!
創建存儲過程:
use ali24; 
create procedure select_u5() 
begin 
select * from 
ali24.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

案例:
use ali24;
create procedure select_u5()
begin
select * from ali24.u5;
end;


create function hello(text string)
returnS string
BEGIN
RETRUEN 'Hello,' || text || '!';
END;

create procedure select_u53()
begin
FOR item IN(
SELECT id,name FROM ali24.u5 limit 3
)
loop
        println item.id || '|' || item.name || '|' || hello(item.name);
end loop;
end;


create procedure pc()
begin
DECLARE tabname VARCHAR DEFAULT 'ali24.u5';
DECLARE id INT;
DECLARE cur CURSOR FOR 'SELECT id FROM ' || tabname;
OPEN cur;
FETCH cur INTO id;
WHILE SQLCODE=0 THEN
  PRINT id;
  FETCH cur INTO id;
END WHILE;
CLOSE cur;
end;

create function hello(text string)
returnS string
BEGIN
RETRUEN 'Hello,' || text || '!';
END;
FOR item IN(
SELECT uid,
uname FROM ali_test.seq1
limit 3 )
loop
        println item.uid || '|' || item.uname || '|' || hello(item.uname);
end loop;

測試調用:
include /usr/local/sc/fp.hql
調用存儲過程: include path/sp name
call sp name;
案例:

call select_u5();

call select_u53();

call hello("text");

call pc();


https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=59690156
http://www.hplsql.org/home http://www.hplsql.org/doc
https://issues.apache.org/jira/browse/HIVE-11055 https://www.cnblogs.com/kinginme/p/7267638.html

創建存儲過程的格式

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

發佈了44 篇原創文章 · 獲贊 6 · 訪問量 2031
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章