scala - 如何从 spark scala 调用 db2 数据库中的存储过程
问题描述
我必须在 db2 中调用一个存储过程,它需要 3 个参数并返回一个整数。谁能帮我从 spark Scala 代码中调用这个 sp。下面是 db2 中的存储过程。
CREATE PROCEDURE TEST_PROC(IN V_DATE DATE,IN V_GROUP VARCHAR(20),IN V_FREQ
VARCHAR(20),IN V_RULE VARCHAR(20), OUT ID INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
LOCK TABLE CAL_LOG IN EXCLUSIVE MODE;
SET ID = (10+ COALESENCE((SELECT MAX(ID) FROM CAL_LOG WITH UR),0));
INSERT INTO CAL_RESULT(ID,P_DATE,GROUP,FREQ,RULE)
VALUES(ID,V-DATE,V_GROUP,V_FREQ,V_RULE);
COMMIT:
END;
PROC 已创建并按预期工作。
现在我想从 spark scala 代码中调用这个过程。我正在尝试下面的代码
val result = spark.read.format("jdbc")
.options(Map(
"url"-> //the db2 url
"driver" - > // my db2 driver
"user name" - > // username
"password" -> // password
""dbtable" -> "(CALL TEST_PROC('2020-07-08','TEST',''TEST','TEST,?)) as proc_result;"
)).load()
但代码片段给出以下错误
DB@ SQL Error: SQLCODE=-104, SQLSTATE=42601
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601
解决方案
您无法使用 Apache Spark 调用存储过程,尽管使用 Spark load 加载相同的数据
从 db2 加载
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df= sqlContext.load("jdbc", Map(
"url" -> "jdbc:db2://xx.xx.xx.xx:50000/SQLDB:securityMechanism=9;currentSchema=vaquarkhan;user=<ur-username>;password=xxxxx;",
"driver" -> "com.ibm.db2.jcc.DB2Driver",
"dbtable" -> "scheam.TableName"))
创建临时表/df 并添加过滤器以获得所需的响应。
推荐阅读
- python - 如何在 fastapi 中管理 sqlalchemy 模型迁移
- java - Java 中 JSON Schema 的验证
- powerbi - Power BI:按 AZ 排序,然后按空格排序
- c# - C# - 如何从另一个方法访问方法内的列表?
- node.js - 如何使用渐进式数字重命名 Multer 中上传的文件?
- bash - bash 取回解释的转义字符串
- python - 基于其他两个变量创建变量
- laravel - 对模型关系 laravel 返回的结果进行排序
- node.js - Nest JS DTO 和实体模型 JSON 不匹配问题
- next.js - NextJS, Postcss.config.js - TypeError: Invalid PostCSS Plugin found at: plugins[0]