使用 Spark Scala 执行雪花程序

时间:2021-07-15 17:17:20

标签: scala apache-spark snowflake-cloud-data-platform procedure

我给您写信是因为我不知道如何使用 Azure Databricks 执行 snowFlake 过程。

这是我的雪花程序:

CREATE OR REPLACE PROCEDURE getBalanceFrontAndInTotalFront(tableName VARCHAR, stringBalanceFront VARCHAR, stringInTotalFront VARCHAR)
RETURNS VARCHAR
NOT NULL
LANGUAGE javascript
AS

$$

var tableName = TABLENAME;
var balanceFront = STRINGBALANCEFRONT;
var inTotalFront = STRINGINTOTALFRONT;

// Dynamically compose the SQL statement to execute.
var sqlCommand = "SELECT BALANCE_FRONT, IN_TOTAL_FRONT, SUM(AMOUNT) AS AMOUNT FROM (SELECT " + balanceFront + " AS \"BALANCE_FRONT\", AMOUNT, " + inTotalFront + " AS \"IN_TOTAL_FRONT\" FROM " + tableName + ") GROUP BY  BALANCE_FRONT, IN_TOTAL_FRONT";

// Prepare statement.
var stmt = snowflake.createStatement({sqlText: sqlCommand});

// Execute Statement
var rs = stmt.execute();
  
arrayValues=[]
 
while (rs.next()) {
    var column1 = rs.getColumnValue(1);
    var column2 = rs.getColumnValue(2);
    var column3 = rs.getColumnValue(3);
    arrayValues.push([column1 + ':' + column3 + ':' + column2]);
}
return arrayValues;

$$;

当我在 SnowFlake 中执行程序时

set stringBalanceFront = 'CASE WHEN Balance_Type like (\'%A%\')THEN \'ACTIVO\' WHEN Balance_Type like (\'%P%\') THEN \'PASIVO\' WHEN Balance_Type like (\'%N%\') THEN \'NETO\' ELSE \'RESTO\' END';
set stringInTotalFront = 'CASE WHEN Balance_Type like (\'%A%\')THEN \'true\' ELSE \'false\' END';

CALL getBalanceFrontAndInTotalFront('DMAAS_OUTPUT_DATA_TABLE_0049_D18CER', $stringBalanceFront, $stringInTotalFront);

我获得下一个字符串数组 RESTO:-184281744:false,ACTIVO:-17881395:true,NETO:20599:false,PASIVO:12672:false

我正在尝试使用以下代码从 Spark 运行此过程,但显然失败了

val stringBalanceFront = Funciones.generarCondiciones(dfOrdenado, Variables.CAMPO_BALANCE_FRONT.toLowerCase())
val stringInTotalFront = Funciones.generarCondiciones(dfOrdenado, Variables.CAMPO_IN_TOTAL_FRONT.toLowerCase())

val query = s"CALL getBalanceFrontAndInTotalFront(${cfgVal.getRutaMasterNoAgregada}, ${stringBalanceFront}, ${stringInTotalFront});"

val arrayBalanceFront = spark.read
  .format(SNOWFLAKE_SOURCE_NAME)
  .options(snowOptionsRead)
  .option("query", query)
  .load()

然后我得到下一个错误:

<块引用>

21/07/15 17:14:36 错误未捕获的用户代码可抛出:net.snowflake.client.jdbc.SnowflakeSQLException:SQL 编译错误: 位置 15 处的语法错误第 1 行意外“CALL”。

从 Spark 执行 SnowFlake 过程的正确方法是什么?请记住,我想将结果返回到 Spark 中的 val。

提前致谢!

最好的问候。

0 个答案:

没有答案