_udf_code 错误

问题描述 投票:0回答:2

一直在尝试开始在 Snowflake 中使用 Python 程序。我有另一个工作正常的基本程序,但我无法让这部分工作。我希望过滤数据框,但收到这个奇怪的错误。

[P0000][100357] Python Interpreter Error: Traceback (most recent call last): File "_udf_code.py", line 6, in run File "/usr/lib/python_udf/de--0d/lib/python3.8/site-packages/snowflake/snowpark/_internal/telemetry.py", line 133, in wrap result = func(*args, **kwar ...

这是存储过程,相当简单

CREATE OR REPLACE PROCEDURE utility.procedure.RECREATE_STALE_STREAM_PYTHON()
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'run'
AS
$$
from snowflake.snowpark.functions import col
def run(session):
    show_streams = "show streams in account;"
    streams = session.sql(show_streams)
    stale_streams = streams.filter(col('stale') == 'true').collect();
    return stale_streams
$$;

提前致谢

我已经尝试了所有我能想到的方法,但似乎没有效果

snowflake-cloud-data-platform
2个回答
1
投票

从 Python 代码调用的存储过程失败并出现错误:

无效标识符“STALE”

发生这种情况是因为Python使用不带双引号的列名生成实际的SQL语句,而实际的列名是用小写字母写的。

如果 SQL 命令中没有双引号,则对象名称始终大写。 (99% 的情况下都没有问题)。

但是,如果对象标识符不是全部大写,则必须使用双引号来保留大小写。在 Python 中,它看起来就像在对象标识符周围添加一对双引号:

(col('"stale"') == 'true')

有关带引号和不带引号的标识符的更多详细信息可以在文档中找到:标识符要求

你是对的,错误的完整堆栈跟踪可以在 UI 控制台中找到。此外,您还可以找到由 Python 生成的实际查询(经典 UI 中的历史记录或 Snowsight 中的活动)并检查其正确性,例如通过在存储过程调用之外运行并使用 SQL 命令进行调试。


1
投票

您的 UDF 定义签名:

CREATE OR REPLACE PROCEDURE utility.procedure.RECREATE_STALE_STREAM_PYTHON()

与指定为处理程序的 Python 函数的签名不匹配:

def run(session):

UDF 定义的签名中具有零个参数。该处理程序的签名中有一个参数。它们需要在数量和类型上匹配(Python 中的松散类型是可以的,但必须能够进行转换)。

这里有一个 Python UDF 示例,显示了匹配的 UDF 定义签名和处理程序签名:

https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-creating.html#specifying-multiple-import-files

UDF签名:

create or replace function multiple_import_files(s string)

与处理程序的签名匹配:

def compute(s):

一种选择是在 UDF 签名中传递

session
的值。但是,请注意名称,因为 session 是保留的 SQL 关键字。

© www.soinside.com 2019 - 2024. All rights reserved.