Как обеспечить пользовательскую функцию для 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, который позволяет следующее:
- Пользователь, чтобы определить функцию в Python
- Превратите эту чистую функцию Python в UDF, встроенную в базу данных.
Тем не менее, интерфейс Python для SQLite имеет способ регистрации функций Python, которые могут быть выполнены в операторе SQL:
https://docs.python.org/2/library/sqlite3.html
В настоящее время нет способа выразить UDF с помощью Blaze, используя SQL-бэкэнд, хотя это может быть реализовано как новый тип выражения, который позволяет пользователю зарегистрировать функцию через API db базовой базы данных.