2015-10-31 6 views
5

Mi collego al database sqlite in Blaze utilizzando df = bz.Data("sqlite:///<mydatabase>) tutto funziona correttamente ma non so come fornire funzioni definite dall'utente nell'interazione con df. Ho una colonna chiamata IP in df che è un testo che contiene indirizzi IP. Ho anche una funzione toSubnet (x, y) che accetta un indirizzo IP (x) in formato testo e restituisce la sua subnet/y. Per esempio:Come fornire una funzione definita dall'utente per python blaze con backlite sqlite?

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

Ora, se voglio mappare tutti gli IP ai loro/14 sottoreti, io uso:

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

che funziona quando il backend è CSV. Ma con backlite sqlite ottengo NotImplementedError. Cosa c'è che non va qui?

risposta

6

NB: Questo non vi dice come fare esattamente quello che vuoi, ma fornisce una spiegazione del motivo per cui non funziona e un possibile passo successivo per arrivare a questo lavoro con SQLite.

Il problema che si sta verificando è che è molto difficile eseguire codice Python arbitrario su un database SQL arbitrario.

Blaze prende il codice utente e lo traduce in SQL nel miglior modo possibile, utilizzando SQLAlchemy, che non credo abbia un modo per farlo.

Dal momento che quasi tutti i database ha un modo diverso di trattare con funzioni definite dall'utente (UDF), si tratta di un bel po 'di lavoro per costruire un API che permette la seguente:

  1. Un utente di definire una funzione in Python
  2. Trasforma quella pura funzione Python in un UDF nativo del database.

Detto questo, l'interfaccia Python per SQLite ha un modo di registrare le funzioni Python che possono essere eseguite in un'istruzione SQL:

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

Attualmente non è un modo per esprimere un'UDF con Blaze utilizzando il back-end SQL, sebbene questo possa essere implementato come nuovo tipo di espressione che consente a un utente di registrare una funzione tramite l'API db del database sottostante.

+1

Penso che sarebbe una buona funzionalità per Blaze supportare UDF in futuro. Quindi l'utente percepisce più astrazione dal set di dati back-end. Molte grazie Phillip per la tua risposta utile. – user2923891