【问题标题】:How to debug a SQL/Python UDF in MonetDB如何在 MonetDB 中调试 SQL/Python UDF
【发布时间】:2017-07-06 12:21:20
【问题描述】:

在 Monetdb 的 SQL UDF 中使用本机 Python 代码非常强大。但是,调试此类 UDF 可能会受益于更多支持。特别是,如果我使用老式的 print('debugging info') 它会消失在黑色的大空白中。

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

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

【问题讨论】:

    标签: python sql user-defined-functions monetdb


    【解决方案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 解释器中运行我的 Python UDF 的主体,其中包含从 MonetDB 收到的确切数据。

    【讨论】:

      【解决方案2】:

      如果有人仍然对此问题感兴趣。 有两种调试 MonetDB 的 Python/UDF 的新方法。

      1) 使用 python 客户端 pymonetdb (https://github.com/gijzelaerr/pymonetdb)。 你可以安装它 throw pip

      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) 使用名为 devudf 的 PyCharm 的 POC 插件,您可以在 pycharm 的插件页面中安装它,或者直接进入 JetBrains 页面:https://plugins.jetbrains.com/plugin/12063-devudf。它在主菜单中添加了一个名为“UDF 开发”的选项,允许您直接将 UDF 从数据库导入和导出到 pycharm,并享受 IDE 的调试功能。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 好点,我已经扩展了答案,所以它不会严重依赖链接。
      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2018-09-30
      相关资源
      最近更新 更多