提问人:dika 提问时间:10/27/2023 更新时间:11/21/2023 访问量:25
带有 Python 代码的 UDF Exasol 函数不起作用
UDF Exasol function with Python code do not work
问:
我想使用 Python 代码为 Exasol 数据库创建一个 UDF,以计算 auc 分数。
SQL 脚本如下所示:
--/
CREATE OR REPLACE PYTHON3 SCALAR SCRIPT TEST_SCHEMA.IDA_EVALUATE_RESULTS(FLAG_LEBEND INT, MASTER_PD_MITT DECIMAL(11,7))
EMITS (AUC DECIMAL(11,7)) AS
import pandas as pd
from sklearn.metrics import roc_auc_score
import numpy as np
from scipy.stats import norm
def calculate_auc_gini(y_emp, y_proba):
auc = roc_auc_score(y_emp, y_proba)
return auc
def run(ctx):
auc = roc_auc_score(ctx.FLAG_LEBEND, ctx.MASTER_PD_MITT)
ctx.emit(auc)
/
SELECT TEST_SCHEMA.IDA_EVALUATE_RESULTS(FLAG_LEBEND, MASTER_PD_MITT) FROM (SELECT * FROM TEST_SCHEMA.ROE_TEST_TABLE_FULL WHERE ROWNUM <= 10000);
我通过将数据导入 Python 来测试 Python 本身中的相同数据的 Python 代码,并且它起作用了。 但是,当我运行 SQL 脚本时,出现以下错误:
[22002] VM error: F-UDF-CL-LIB-1127: F-UDF-CL-SL-PYTHON-1002: F-UDF-CL-SL-PYTHON-1026: ExaUDFError: F-UDF-CL-SL-PYTHON-1114: Exception during run IDA_EVALUATE_RESULTS:12 run File "/usr/lib/python3/dist-packages/sklearn/metrics/ranking.py", line 277, in roc_auc_score sample_weight=sample_weight) File "/usr/lib/python3/dist-packages/sklearn/metrics/base.py", line 70, in _average_binary_sc ...
预测列 (MASTER_PD_MITT) 的值介于 0-1 之间,而实现列的值FLAG_LEBEND只有 1 或零值。这两个类在所选数据中都可用。
我不知道为什么SQL脚本不起作用,而Python中的相同脚本正在工作。
答:
0赞
MarkusN
11/21/2023
#1
您使用了错误的 UDF 类型。“SCALAR”表示函数应用于每一行,即“y_emp”和“y_proba”不是向量,而是单个值。
您必须将 UDF 类型定义为 «SET»。现在,您必须遍历输入表的所有行,收集列“y_emp”和“y_proba”的值,然后将它们传递给聚合函数 roc_auc_Score()。
评论