5

すべて正常に動作する Blaze で sqlite データベースに接続します df = bz.Data("sqlite:///<mydatabase>) が、df とのやり取りでユーザー定義関数を提供する方法がわかりません。IPアドレスを含むテキストであるdfにIPという列があります。また、IP アドレス (x) をテキスト形式で受け取り、その /y サブネットを返す関数 toSubnet (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. ここで何が問題なのですか?

4

1 に答える 1

6

注意:これは、あなたが望むことを正確に行う方法を示しているわけではありませんが、それが機能しない理由と、これを SQLite で機能させるための可能な次のステップの説明を提供します。

あなたが直面している問題は、任意の SQL データベースに対して任意の Python コードを効率的に実行することが非常に難しいということです。

Blaze はユーザー コードを取得し、SQLAlchemy を使用して、可能な限り SQL に変換しますが、これを行う方法はないと思います。

ほぼすべてのデータベースでユーザー定義関数 (UDF) を処理する方法が異なるため、次のことを可能にする API を構築するのは非常に手間がかかります。

  1. Python で関数を定義するユーザー
  2. その純粋な Python 関数をデータベースにネイティブな UDF に変換します。

つまり、SQLite への Python インターフェイスには、SQL ステートメントで実行できる Python 関数を登録する方法があります。

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

現在、SQL バックエンドを使用して Blaze で UDF を表現する方法はありませんが、これは、ユーザーが基礎となるデータベースの db API を介して関数を登録できるようにする新しい式タイプとして実装できます。

于 2015-11-02T17:19:00.450 に答える