2016-11-18 53 views
6

特別我想打電話給Postgres levenshtein函數。 我還想寫大火查詢返回相似詞「相似」的話,即相當於:來自Blaze的調用SQL函數

select word from wordtable where levenshtein(word, 'similar') < 3; 

在布拉本應該是這個樣子

db.wordtable.word[levenshtein(db.wordtable.word, 'similar') < 3] 

levenshtein不在我正在python端導入的任何模塊中定義。 我在哪裏/如何獲得一個levenshtein定義在Python方面用於Blaze表達式?


我已經找到了sqlalchemy.sql.func包提供的Python處理用於與SQLAlchemy的使用SQL功能,但這些並不在火焰表達式工作。是否有等價的Blaze軟件包,或者如何在Blaze表達式中使用sqlalchemy.sql.func.levenshtein

+1

請注意,我並不熟悉Blaze。不過,我希望對'levenshtein'函數的明確支持是不太可能的,因爲它甚至不是PostgreSQL核心語言的一部分,而是來自'fuzzystrmatch'模塊的擴展。所以可能你真正需要知道的是如何擴展Blaze表達式來支持自定義SQL函數。 – beldaz

+1

http://stackoverflow.com/a/33483264/290182似乎表明支持UDFs(也可能是擴展模塊)目前尚不可用,儘管顯然是可能的。 – beldaz

回答

1

Blaze只是一個前端;並重新構造,然後將查詢提供給SQL後端,該後端從數據庫收集數據。

From the doku

對SQL數據庫的工作是什麼操作?大多數表格操作,但不是全部。 SQLAlchemy翻譯是高優先級。失敗包括數組 像切片操作和點產品在SQL中沒有意義。 此外,通過SQLAlchemy支持的某些操作(例如日期時間訪問)還不夠好 。最後,一些數據庫,如SQLite, 對像sin這樣的常見數學函數的支持有限。

Blaze旨在忘記後端,併爲所有後端都具有相似/相同的語法。因此它只支持常用操作。在我看來,沒有可能指定sqlalchemy或postgresql函數來使用,因此我認爲現在這是不可能的。

... 但是 blaze的版本爲0.10,這是一種在去年積極貢獻的beta版本。我相信,這將在一段時間內得到執行。您始終可以跟蹤release notes中的更改。

此外: 有關SQL中的UDF(用戶定義的函數)和使用它們的詳細說明,請比較link provided by beldaz(與此問題非常相似)。

+0

我不想將我的功能傳遞給後端。 Postgres支持有一個'levenshtein'功能。我的問題是如何構建一個blaze查詢來調用後端函數,或者更普遍的是,如果一些後端實現了一個新的函數,如何在沒有得到未定義的錯誤的情況下引用它。 –

+0

是的,當然。也許我寫得不清楚。我當然意味着你想通過閃耀的sql功能傳遞給sql驅動程序。但我認爲這是不可能的現在... –

+1

謝謝,我誤解了。這確實回答了我的問題。 –

2

PyPi是你的朋友。搜索那裏發現python-Levenshtein 包。如果你使用的是Windows並且需要預編譯版本,請使用Christoph Gohlke's wheel(他的構建是安全,可靠和正確的; numpy構建使用MKL庫,因此它們也很快!)。

+0

我沒有在Python中實際實現levenshtein距離的函數。我需要一個Python函數,它會被Blaze翻譯成生成的SQL查詢中的levenshtein調用。 –

+0

對不起,我得到的印象是你正在尋找Python中levenshtein距離的實現。看起來您需要使用較低級別的SQLAlchemy功能來按照您的要求完成此操作。 – cco

1

如果您希望看到這些詞並對它們執行一些簡單的操作,您可以嘗試從Postgres查詢中將過濾的數據加載到Blaze。

from blaze import data 
import sqlalchemy as sa 

engine = sa.create_engine('postgresql://...') 
result = engine.execute('''select word from wordtable where levenshtein(word, 'similar') < 3;''') 
rows = result.fetchall() 
wordtable = data(rows) 

# Now you may work with wordtable as a blaze table 
wordtable[wordtable.word.like('a*')] # all words starting with 'a' 
+0

但你爲什麼要這麼做?對我而言,由於內存問題,blaze的關鍵特性並不是加載完整的數據庫......我想做出或多或少複雜的查詢,而不需要編寫sql函數,而是使用常用的python語法編寫。這是(imo)用戶案例,而不是操縱已加載的數據。 –

+0

我猜有時啓動Python的Python接口並不會給你這樣的靈活性,並且需要更多的解決方法,那麼就把這個任務交給SQL即可。您不必將所有字符串加載到數據庫,您可以逐字地加載它們以隨時分發內存需求。 –