Как обеспечить пользовательскую функцию для Python Blaze с SQLite Backend?

Я подключаюсь к базе данных sqlite в Blaze, используяdf = bz.Data("sqlite:///<mydatabase>)все работает нормально, но я не знаю, как обеспечить пользовательские функции в моем взаимодействии с df. У меня есть столбец под названием IP в df, который является текстом, содержащим 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 ответ

NB: Это не говорит вам, как делать именно то, что вы хотите, но дает объяснение, почему это не работает, и возможный следующий шаг, чтобы заставить это работать с SQLite.

Проблема, с которой вы сталкиваетесь, заключается в том, что очень трудно эффективно выполнить произвольный код Python для произвольной базы данных SQL.

Blaze берет пользовательский код и переводит его в SQL как можно лучше, используя SQLAlchemy, который, я думаю, не имеет способа сделать это.

Поскольку почти в каждой базе данных есть свой способ работы с пользовательскими функциями (UDF), довольно много работы по созданию API, который позволяет следующее:

  1. Пользователь, чтобы определить функцию в Python
  2. Превратите эту чистую функцию Python в UDF, встроенную в базу данных.

Тем не менее, интерфейс Python для SQLite имеет способ регистрации функций Python, которые могут быть выполнены в операторе SQL:

https://docs.python.org/2/library/sqlite3.html

В настоящее время нет способа выразить UDF с помощью Blaze, используя SQL-бэкэнд, хотя это может быть реализовано как новый тип выражения, который позволяет пользователю зарегистрировать функцию через API db базовой базы данных.

Другие вопросы по тегам