一直在尝试开始在 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
$$;
提前致谢
我已经尝试了所有我能想到的方法,但似乎没有效果
从 Python 代码调用的存储过程失败并出现错误:
无效标识符“STALE”
发生这种情况是因为Python使用不带双引号的列名生成实际的SQL语句,而实际的列名是用小写字母写的。
如果 SQL 命令中没有双引号,则对象名称始终大写。 (99% 的情况下都没有问题)。
但是,如果对象标识符不是全部大写,则必须使用双引号来保留大小写。在 Python 中,它看起来就像在对象标识符周围添加一对双引号:
(col('"stale"') == 'true')
有关带引号和不带引号的标识符的更多详细信息可以在文档中找到:标识符要求
你是对的,错误的完整堆栈跟踪可以在 UI 控制台中找到。此外,您还可以找到由 Python 生成的实际查询(经典 UI 中的历史记录或 Snowsight 中的活动)并检查其正确性,例如通过在存储过程调用之外运行并使用 SQL 命令进行调试。
您的 UDF 定义签名:
CREATE OR REPLACE PROCEDURE utility.procedure.RECREATE_STALE_STREAM_PYTHON()
与指定为处理程序的 Python 函数的签名不匹配:
def run(session):
UDF 定义的签名中具有零个参数。该处理程序的签名中有一个参数。它们需要在数量和类型上匹配(Python 中的松散类型是可以的,但必须能够进行转换)。
这里有一个 Python UDF 示例,显示了匹配的 UDF 定义签名和处理程序签名:
UDF签名:
create or replace function multiple_import_files(s string)
与处理程序的签名匹配:
def compute(s):
一种选择是在 UDF 签名中传递
session
的值。但是,请注意名称,因为 session 是保留的 SQL 关键字。