【问题标题】:_udf_code error when using filter within a Python Stored Procedure在 Python 存储过程中使用过滤器时出现 _udf_code 错误
【发布时间】:2022-11-11 05:15:26
【问题描述】:

一直在尝试开始在 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
$$;

提前致谢

我已经尝试了我能想到的一切,似乎没有任何效果

【问题讨论】:

  • 完整的堆栈跟踪是不可见的,所以我尝试自己运行它。在我的情况下,它失败并出现错误:invalid identifier 'STALE' in function RECREATE_STALE_STREAM_PYTHON with handler run。如果您看到相同的内容,请尝试以下操作:(col('"stale"') == 'true') 双引号将有助于保存与show streams 返回的列名匹配的小写字母
  • 这完美地工作。我不知道如何找到完整的堆栈跟踪,现在已经通过控制台找到了,所以应该会有很大帮助!下一步是更好地阅读它以找到实际错误。感谢您的回复!这解决了问题,我感觉我的方向错了,但找不到任何可以帮助缩小范围的东西。但我无法将您的评论标记为答案

标签: snowflake-cloud-data-platform


【解决方案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 关键字。

【讨论】:

  • 感谢您对此的回复,由于这个错误,我最初将会话添加到程序的主要功能中。这似乎是 Python 过程与 Python 函数不同的一种方式。除非有其他方式我应该将会话传递给主函数? Python 函数定义为 0 个参数(包括会话),但存储过程定义包含 0 个参数。 Python 函数参数应该是函数 RECREATE_STALE_STREAM_PYTHON 中会话和存储过程定义的参数,并带有处理程序运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2018-02-09
  • 1970-01-01
  • 2021-08-26
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多