如何在sql中使用python函数:dai.DaiUDF
由bq5973r5创建,最终由bq5973r5 被浏览 7 用户
在日常投研里,SQL 擅长数据读写与过滤,但在复杂计算上可用算子有限;Python 则拥有 numpy/scipy/pandas 等丰富工具,但一旦离开 SQL 查询链路,就容易出现“先拉数据 → 再本地算 → 再落表/再 join”的低效流程。\n因此我们需要一种方式:保留 SQL 的读写效率,同时把 Python 的复杂计算注入到查询中。我们可以使用平台中的dai.DaiUDF函数,它实现了在 Python 里写函数 → 注册成 UDF → SQL 里直接调用。
dai.DaiUDF
dai.DaiUDF (name, function, parameters=None, return_type=None, type=UDFType.NATIVE, null_handling=FunctionNullHandling.DEFAULT, exception_handling=ExceptionHandling.DEFAULT, side_effects=False)
DAI Python UDF类。
参数:
- name: str,SQL语句。
- function: Callable,函数体。
- parameters: List[DaiPyType],参数列表,默认为空。
- return_type: DaiPyType,返回值类型,默认为空。
- type: UDFType,函数类型,默认为UDFType.NATIVE。
- null_handling: FunctionNullHandling,是否处理空值,默认为FunctionNullHandling.DEFAULT。
- exception_handling: ExceptionHandling,是否处理异常,默认为ExceptionHandling.DEFAULT。
- side_effects: bool,是否产生副作用,默认为False。
自定义函数参数和返回值的数据类型:
- DaiType
- BIGINT
- BIT
- BLOB
- BOOLEAN
- DATE
- DOUBLE
- FLOAT
- HUGEINT
- INTEGER
- INTERVAL
- SMALLINT
- SQLNULL
- TIME
- TIMESTAMP
- TIMESTAMP_MS
- TIMESTAMP_NS
- TIMESTAMP_S
- TIMESTAMP_TZ
- TIME_TZ
- TINYINT
- UBIGINT
- UINTEGER
- USMALLINT
- UTINYINT
- UUID
- VARCHAR
1.写一个最简单的 Python 函数
把输入乘 2(timestwo)
import dai
import numpy as np
def timestwo(x):
return x * 2
函数是传入一个 array,返回一个 array
2.注册成 UDF(SQL 才能认得这个函数)
timestwo_udf = dai.DaiUDF(
name="timestwo",
function=timestwo,
return_type="double",
)
注册后的 UDF 只在自己的账号下可用,主要是避免全员 import 时加载大量 UDF,带来内存/时间开销。
3.SQL 里像内置函数一样调用
sql = """
select
date,
instrument,
close,
timestwo(close) as factor
from cn_stock_prefactors
"""
4.执行查询时把 UDF 放进 udf_list
只要你用到了 udf_list,就必须在 query 的时候传进去。
df = dai.query(
sql,
udf_list=[timestwo_udf],
filters={"date": ["2024-01-01", "2024-02-01"]},
).df()
df
5.输出结果
6.关键约束与用法细节
输入向量长度必须与输出向量长度一致;比如你传入 array,不能直接返回一个标量 std,必须把标量“扩展回同长度向量”。
\