首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python存储过程中使用筛选器时发生_udf_code错误

在Python存储过程中使用筛选器时发生_udf_code错误
EN

Stack Overflow用户
提问于 2022-11-09 18:58:29
回答 2查看 75关注 0票数 0

一直试图开始在雪花中使用Python过程。我有另一个基本的程序,很好,但我不能让这部分工作。我希望过滤一个数据,但得到这个奇怪的错误。

代码语言:javascript
复制
[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 ...

下面是存储过程,它非常简单

代码语言:javascript
复制
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
$$;

提前感谢

我已经试过了我能想到的一切,似乎都没有用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-11 08:48:18

从Python代码中调用的存储过程失败,错误如下:

无效标识符'STALE‘

在本例中,之所以发生这种情况,是因为Python使用不带双引号的列名生成实际的SQL语句,而实际的列名是用小号书写的。

如果SQL命令中没有双引号,则对象名称总是大写的。(这在99%的病例中是罚款的)。

但是,如果对象标识符不是所有大写的,那么必须使用双引号来保留大小写。在Python中,它看起来像是在对象标识符周围添加了一对双引号:

代码语言:javascript
复制
(col('"stale"') == 'true')

有关引号和未引号标识符的详细信息,请参阅doc:标识符要求

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

票数 1
EN

Stack Overflow用户

发布于 2022-11-10 01:42:27

您的UDF定义签名:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE utility.procedure.RECREATE_STALE_STREAM_PYTHON()

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

代码语言:javascript
复制
def run(session):

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

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

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

UDF签名:

代码语言:javascript
复制
create or replace function multiple_import_files(s string)

匹配处理程序的签名:

代码语言:javascript
复制
def compute(s):

一个选项是在UDF签名中传递session的值。但是,请注意名称,因为session是保留的SQL关键字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74380061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档