带有 Python 代码的 UDF Exasol 函数不起作用

UDF Exasol function with Python code do not work

提问人:dika 提问时间:10/27/2023 更新时间:11/21/2023 访问量:25

问:

我想使用 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中的相同脚本正在工作。

Python 数据库 用户定义函数 AUC Exasol

评论


答:

0赞 MarkusN 11/21/2023 #1

您使用了错误的 UDF 类型。“SCALAR”表示函数应用于每一行,即“y_emp”和“y_proba”不是向量,而是单个值。

您必须将 UDF 类型定义为 «SET»。现在,您必须遍历输入表的所有行,收集列“y_emp”和“y_proba”的值,然后将它们传递给聚合函数 roc_auc_Score()。