Snowflake如何调用Snowpark中的外部函数

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

我想从 Snowpark python 代码调用 Snowflake 中定义的外部函数。例如,我尝试像这样操作数据框:

dataframe = dataframe.with_column('name', sql_expr("select test_ext(3,4)"))

然而,函数

sql_expr
的输入没有被 python 解释器识别。 (这里,test_ext() 是一个与 Azure 集成的外部函数。)

syntax error line 1 at position 85 unexpected 'select'.
syntax error line 1 at position 103 unexpected '4'.

我使用的语法正确吗?官方文档没有给出任何示例

sql_expr

python sql snowflake-cloud-data-platform data-warehouse
2个回答
0
投票

我无法重现相同的错误,但它应该像下面这样工作:

  1. 您需要使用模块功能:
from snowflake.snowpark.functions import function 
  1. 从 ext 函数创建一个函数对象:
test_ext = function("test_ext")
  1. 那么你应该可以这样称呼它:
dataframe = dataframe.with_column('name', test_ext(3,4))

0
投票

一种选择是使用 Ponder,它实现了 pandas.apply,无需太多额外的工作。一个技巧是您需要使用 Python 3.8 编写函数,因为 3.10 python 代码中的操作码与 Snowflake 不兼容:

In [1]: import snowflake.connector
   ...: import ponder
   ...: import modin.pandas as pd
   ...: snowflake_conn = snowflake.connector.connect(
   ...:               user="<USER>",
   ...:               password="<PASS>",
   ...:               account="<ACCOUNT>",
   ...:               role="<ROLE>",
   ...:               database="<DB>",
   ...:               schema="<SCHEMA>",
   ...:               WAREHOUSE="<WH>",
   ...:          )
   ...: ponder.init()
   ...: ponder.configure(default_connection=snowflake_conn)

In [2]: df = pd.read_sql("ORDERS", snowflake_conn)
   ...: df['O_TOTALPRICE']
Out[2]: 
0       69652.08
1      125083.85
2      125538.32
3       95524.74
4      269980.56
         ...    
976     85624.93
977     14243.38
978     53057.98
979     59465.14
980    142011.37
Name: O_TOTALPRICE, Length: 981, dtype: float64
In [3]: def add_ten(x):
   ...:     return x + 10
   ...: 

In [4]: df['O_TOTALPRICE'].apply(add_ten)
Out[4]: 
0       69662.08
1      125093.85
2      125548.32
3       95534.74
4      269990.56
         ...    
976     85634.93
977     14253.38
978     53067.98
979     59475.14
980    142021.37
Name: O_TOTALPRICE, Length: 981, dtype: float64


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