R bigrquery -如何从执行的SQL中捕获错误消息?

dxxyhpgq  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(154)

假设我有一些刷新数据表的SQL代码,我想安排一个R脚本来安排这段代码每天运行,有没有办法捕获SQL代码可能抛出的任何潜在错误消息,并将该错误消息保存到R变量中,而不是显示在R控制台日志中?
例如,假设我在BigQuery中有一个存储过程sp_causing_error(),它从源表source_table中获取数据并刷新目标表table_to_refresh

CREATE OR REPLACE PROCEDURE sp_causing_error()
BEGIN

CREATE OR REPLACE TABLE table_to_refresh AS (
   Select non_existent_column, x, y, z
   From source_table
);

END;

假设source_table的模式已更改,列non_existent_column不再存在。当尝试通过以下方式在RStudio中调用sp_causing_error()时:

library(bigrquery)

query <- "CALL sp_causing_error()"

bq_project_query(my_project, query)

我们会在控制台上打印一条错误消息(它掩盖了在BigQuery中运行时会遇到的实际错误消息):
UseMethod("as_bq_table")中的错误:"as_bq_table"没有适用的方法应用于类"NULL"的对象
如果我们在BigQuery中运行sp_causing_error(),它会抛出一条错误消息,指出:
查询错误:无法识别的名称:[sp抛出错误:3:8]处不存在列
当执行SQL时,BigQuery中显示的查询错误消息是否在bigrquery中的任何位置捕获?我的目标是在R脚本中有某种try/catch块,用于捕获错误消息,如果SQL代码没有成功运行,则可以将该错误消息写入输出文件。希望有一种方法可以从BigQuery中捕获描述性错误消息,并将其分配给R变量以供进一步处理。

    • 更新**

R的tryCatch()函数在这里非常有用,可以捕获R错误消息:

query <- "CALL sp_causing_error()"

result <- tryCatch(
  bq_project_query("research-01-217611", query),
  error = function(err) {
    return(err)
  }
)

result现在包含来自R控制台的错误消息:
使用方法中的错误("as_bq_table"):没有适用于'as_bq_table'的方法应用于类"NULL"的对象〉
然而,这仍然不能描述我们在BigQuery中执行相同的SQL代码时看到的实际错误消息,上面引用的代码引用了一个无法识别的列名。我们是否能够捕获该错误消息,而不是更一般的R错误消息?

e0bqpujr

e0bqpujr1#

更新/答复

使用BigQuery的Begin...Exception... End语法 Package R中的存储过程调用,让我们可以获得实际的错误消息。

query <- '
BEGIN
    CALL sp_causing_error();
EXCEPTION WHEN ERROR THEN
    Select 1 AS error_flag, @@error.message AS error_message, @@error.statement_text AS error_statement_text, @@error.formatted_stack_trace AS stack_trace
    ;
END;
'

query_result <- bq_table_download(bq_project_query(<project>, query))

error_flag <- query_result["error_flag"][[1]]

if (error_flag == 0) {
    print("Job ran successfully")
} else {
    print("Job failed")
    # Access error message variables here and take additional action as desired
}

**警告:**请注意,如果存储过程成功完成,此解决方案可能会导致R错误,因为error_flag将不存在,除非在存储过程的末尾显式传递。解决方法是在BigQuery中的存储过程末尾添加一行以适当地设置标志,以便bq_table_download()函数在存储过程成功运行时获得值:

BEGIN
-- BigQuery stored procedure code
-- ...
-- ...
Select 0 AS error_flag;
END;

相关问题