2015-10-31 6 views
5

blazeでsqliteデータベースに接続します。 df = bz.Data("sqlite:///<mydatabase>) すべて正常に動作しますが、dfとのやりとりでユーザー定義関数を提供する方法がわかりません。 IPアドレスを含むテキストであるdfにIPという名前の列があります。私はテキスト形式のIPアドレス(x)を取り込み、その/ yサブネットを返す関数toSubnet(x、y)も持っています。例えば:私は彼ら/ 14のサブネットにすべてのIPをマップする場合どのようにsqliteバックエンドでPythonの火災のユーザー定義関数を提供するには?

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

は今、私が使用:バックエンドがCSVであるときに動作

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

。しかし、sqliteのバックエンドで私はNotImplementedErrorを取得します。 ここに何が問題なのですか?

答えて

6

NB:これは正確に何をしたい行う方法を教えてくれませんが、それが動作し、これはSQLiteので動作するように取得することができ、次のステップしない理由それはの説明を提供します。

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

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

ほぼすべてのデータベースは、ユーザー定義関数(UDF)を扱う別の方法を持っているので、それが仕事のかなり多くは、以下のことができますAPI構築することです:

  1. 関数を定義するためのユーザをPythonで
  2. 純粋なPython関数を、データベースに固有のUDFに変換します。現在、UDFを表現する方法ではありません

    あり

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

    :SQLiteのにPythonインタフェースは、SQL文で実行することができますPythonの関数を登録する方法をしている、と述べた

BlazeでSQLバックエンドを使用していますが、これはユーザーが基になるデータベースのdb APIを介して関数を登録できる新しい式の型として実装できます。

+1

将来的には、BlazeがUDFをサポートするうえで便利だと思います。その後、ユーザはバックエンドデータセットからより抽象度が高いと感じます。あなたの役に立つ答えに多くの感謝のフィリップ。 – user2923891

関連する問題