在Monetdb中的SQL UDF中使用本机Python代码非常强大。但是,调试此类UDF可以从更多支持中受益。特别是,如果我使用老式的打印('调试信息'),它就会消失在大黑的空白中。
create function dummy()
returns string
language python{
print('Entering the dummy UDF')
return 'hello';
};
如何从服务器或MonetDB客户端检索此信息。
答案 0 :(得分:1)
上周我正在调试一些Python UDF:)
步骤1:首先确保您的Python代码至少可以在Python解释器中使用。
步骤2:在Python UDF中,编写调试信息。到文件,例如:
f = open('/tmp/debug.out', 'w')
f.write('my debugging info\n')
f.close()
这不太理想,但它有效。另外,我用它来导出Python UDF的参数值。通过这种方式,我可以在Python解释器中使用从MonetDB接收的确切数据运行Python UDF的主体。
答案 1 :(得分:1)
以防仍然有人对此问题感兴趣。 调试MonetDB的Python / UDF有两种新颖的方法。
1)使用python客户端pymonetdb(https://github.com/gijzelaerr/pymonetdb)。 您可以安装它扔点子
pip install numpy
要使用它,请考虑以下设置,其中包含一个包含整数的表和一个计算给定列的平均绝对偏差的UDF。
CREATE TABLE integers(i INTEGER);
INSERT INTO integers VALUES (1), (3), (6), (8), (10);
CREATE OR REPLACE FUNCTION mean_deviation(column INTEGER)
RETURNS DOUBLE LANGUAGE PYTHON {
mean = 0.0
for i in range (0, len(column)):
mean += column[I]
mean = mean / len(column)
distance = 0.0
for i in range (0, len(column)):
distance += column[i] - mean
deviation = distance/len(column)
return deviation;
};
要使用终端调试(即pdb)调试功能,您只需要使用pymonetdb.connect()打开数据库连接,然后从连接中获取一个游标对象,并通过游标对象调用debug( )函数,将要检查的SQL和要调试的UDF名称作为参数发送。
import pymonetdb
conn = pymonetdb.connect(database='demo') #Open Database connection
c = conn.cursor()
sql = 'select mean_deviation(i) from integers;'
c.debug(sql, 'mean_deviation') #Console Debugging
有一个可选的采样步骤,该步骤仅传输数据的统一随机样本,而不是完整的输入数据集。如果您想采样,则只需发送希望从采样中获取的元素数(例如,如果您希望包含10个元素的子集,则为c.debug(sql,'mean_deviation',10)
2)使用PyCharm的POC插件devdevf,可以安装该插件扔pycharm插件页面,或直接转到JetBrains页面:https://plugins.jetbrains.com/plugin/12063-devudf。它在主菜单“ UDF开发”中添加了一个选项,并允许您直接从数据库直接将UDF导入和导出到pycharm,并享受IDE的调试功能。