如何在MonetDB中调试SQL / Python UDF

时间:2017-07-06 12:21:20

标签: python sql user-defined-functions monetdb

在Monetdb中的SQL UDF中使用本机Python代码非常强大。但是,调试此类UDF可以从更多支持中受益。特别是,如果我使用老式的打印('调试信息'),它就会消失在大黑的空白中。

create function dummy() 
returns string
language python{
    print('Entering the dummy UDF')
    return 'hello';
};

如何从服务器或MonetDB客户端检索此信息。

2 个答案:

答案 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的调试功能。