Class UDF
Class UDF基于面向对象编程范式实现,主要目的是为了创建有状态的处理逻辑。函数要求实现__init__, __call__等方法。
Class UDF注册
Class UDF注册传入的是Python类,对于__init__、__call__、 __del__ 3个实例方法有特殊的含义认定,详情请参见下表;其他的Python类和实例方法不做限制,用户可以任意添加。
| Python Class方法 | 是否必须 | 参数 | 含义 | 适用场景 |
|---|---|---|---|---|
| __init__(self, *args, **kwargs) | 否 | 通过with_arguments方法传入参数,只允许传入标量Scalar。 | UDF的构造方法。 | 初始化UDF属性(如保存参数、打开文件、建立连接等)。 |
| __call__(self, *args, **kwargs) | 是 | 通过UDF算子传入参数,可以传入标量Scalar和列名Column。 | UDF的业务逻辑方法入口。 | UDF处理数据、执行计算。 |
| __del__(self) | 否 | 不支持传入参数。 | UDF的析构方法。 | UDF资源清理(如关闭文件、断开网络连接等)。 |
示例
import ibis
import aura_frame as aura
from aura_frame.multimodal import ai_lake
target_database = "test"
class Hello:
def __init__(self, firstname: str, lastname: str):
self.firstname = firstname
self.lastname = lastname
def __call__(self, location: str) -> str:
return f"Hello {self.firstname} {self.lastname}! Welcome to {location}"
conn = ai_lake.connect(
aura_endpoint=os.getenv("aura_endpoint"),
aura_endpoint_name=os.getenv("aura_endpoint_name"),
aura_workspace_id=os.getenv("aura_workspace_id"),
lf_catalog_name=os.getenv("lf_catalog_name"),
access_key=os.getenv("access_key"),
secret_key=os.getenv("secret_key"),
default_database=target_database,
use_single_cn_mode=True
)
udf = conn.get_function("add_udf", database=target_database)
# 使用Class UDF
ds = conn.load_dataset(name="your-table", schema="your-schema")
ds = ds.map(fn=udf, on=[ds.city], as_col="new_column", firstname="Ethan", lastname="Carter")
ds.select_columns([ds.city, ds.new_column])
ds.show(limit=1)