如何使用sqlite后端为python blaze提供用户定义的函数?

时间:2015-10-31 05:00:19

标签: python sqlite blaze

我使用Blaze连接到sqlite数据库 df = bz.Data("sqlite:///<mydatabase>) 一切正常,但我不知道如何在与df的交互中提供用户定义的函数。 我在df中有一个名为IP的列,它是包含IP地址的文本。我还有一个函数toSubnet(x,y),它接收文本格式的IP地址(x)并返回其/ y子网。例如:

out = toSubnet('1.1.1.1',24)
out
1.1.1.0/24

现在,如果我想将所有IP映射到它们的/ 14子网,我使用:

df.IP.map(lambda x:toSubnet(x,14),'string')

当后端为CSV时有效。但是对于sqlite后端,我得到NotImplementedError。 这有什么不对?

1 个答案:

答案 0 :(得分:6)

NB:这并没有告诉您如何完全按照自己的意愿行事,但它提供了为什么不起作用的解释以及可能的下一步让它与SQLite一起使用。

您遇到的问题是,针对任意SQL数据库高效执行任意Python代码非常困难。

Blaze使用SQLAlchemy获取用户代码并尽可能地将其转换为SQL,我认为没有办法实现此目的。

由于几乎每个数据库都有不同的处理用户定义函数(UDF)的方法,因此构建允许以下内容的API需要做很多工作:

  1. 用于在Python中定义函数的用户
  2. 将纯Python函数转换为数据库的UDF本机。
  3. 也就是说,SQLite的Python接口有一种方法来注册可以在SQL语句中执行的Python函数:

    https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.create_function

    目前没有办法使用SQL后端使用Blaze表达UDF,尽管这可以实现为允许用户通过底层数据库的db API注册函数的新表达式类型。