2016-11-18 3 views
6

특히 Postgres levenshtein 함수를 호출하고 싶습니다. 없는이Blaze에서 SQL 함수 호출하기

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

하지만 levenshtein처럼 보일 것이다 블레이즈에서

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

: 나는에 해당하는 즉, 단어 '유사'와 비슷한 단어를 반환하는 불꽃 쿼리를 작성하고 싶습니다 내가 파이썬 측에서 가져올 어떤 모듈에 정의되어있다. /012 어떻게 Python 측에서 Blaze 표현식에 사용할 levenshtein 정의를 얻을 수 있습니까?


파이썬이 SqlAlchem ​​y에서 사용하기위한 SQL 함수 핸들 제공하는 sqlalchemy.sql.func 패키지를 발견했다, 그러나 이들은 블레이즈 표현에서 작동하지 않습니다. 해당하는 Blaze 패키지가 있습니까? 아니면 Blaze 표현식에 sqlalchemy.sql.func.levenshtein을 어떻게 사용할 수 있습니까?

+1

Blaze에 익숙하지 않습니다.그러나,'levenshtein' 함수에 대한 명시 적 지원은 PostgreSQL 핵심 언어의 일부가 아니기 때문에 가능성이 없지만,'fuzzystrmatch' 모듈의 확장입니다. 따라서 여러분이 정말로 알아야 할 것은 아마도 커스텀 SQL 함수를 지원하기 위해 Blaze 표현식을 확장하는 방법 일 것입니다. – beldaz

+1

http://stackoverflow.com/a/33483264/290182 UDF (및 확장 모듈이라고도 함)에 대한 지원은 현저히 가능하지만 현재 사용할 수 없습니다. – beldaz

답변

1

블레이즈는 프론트 엔드입니다. 재구성 한 다음 DB에서 데이터를 수집하는 SQL 백엔드에 쿼리를 제공합니다.

From the doku : SQL 데이터베이스 작업을 어떤 작업

? 대부분의 테이블 작업이지만 전부는 아닙니다. SQLAlchemy 번역이 최우선 순위입니다. 실패에는 배열 과 같은 조작이 포함되어 있습니다. SQL에서는 점 분리 (dot product)가 의미가 없습니다. 또한 datetime 액세스와 같은 일부 작업은 SQLAlchemy를 통해 을 지원하는 것이 적합하지 않습니다. 마지막으로 SQLite와 같은 일부 데이터베이스 인 은 죄와 같은 일반적인 수학 기능을 제한적으로 지원합니다.

블레이즈는 모든 백엔드에 대해 백엔드를 잊어 버리고 유사한/동일한 구문을 사용합니다. 따라서 일반적인 작업 만 지원합니다. 내 의견으로는 블레이즈가 사용할 sqlalchemy 또는 postgresql 함수를 지정할 가능성이 없으므로 지금까지는 불가능하다고 생각합니다.

... but 블레이즈 버전은 0.10이며 작년에 적극적으로 기여한 베타 버전입니다. 나는 이것이 약간의 시간에 구현 될 것이라고 확신한다. release notes에서 변경 사항을 항상 추적 할 수 있습니다.

추가 : SQL의 UDF (사용자 정의 함수)에 대한 자세한 설명은 link provided by beldaz (이 질문과 매우 유사)을 비교하십시오.

+0

나는 내 기능을 백엔드에 전달하고 싶지 않습니다. Postgres는'levenshtein' 함수를 지원합니다. 내 문제는 백엔드 함수를 호출하는 블레이즈 쿼리를 생성하는 방법입니다. 또는 더 일반적으로 일부 백엔드가 새 함수를 구현하는 경우 더 일반적으로 정의되지 않은 오류가 발생하지 않고 블레이즈에서이를 참조하는 방법입니다. –

+0

그래, 물론. 어쩌면 나는 명확하게 썼지 않을지도 모른다. 나는 확실히 당신이 불꽃을 통해 SQL 함수에 SQL 드라이버를 전달하기를 원한다는 것을 의미한다. 하지만 지금은 이것이 가능하지 않다고 생각합니다 ... –

+1

고마워, 오해. 그게 내 질문에 대한 답변입니다. –

2

PyPi은 (는) 친구입니다. 거기에서 검색하면 python-Levenshtein 패키지가 있습니다. 윈도우가 있고 미리 컴파일 된 버전을 원할 경우 Christoph Gohlke's wheel을 사용하십시오 (그의 빌드는 안전하고 신뢰할 수 있으며 정확하며 numpy 빌드는 MKL 라이브러리를 사용하므로 빠릅니다!).

+0

파이썬에서 실제로 levenshtein 거리를 구현하는 함수가 아닙니다. 생성 된 SQL 쿼리 내에서 Blaze가 levenshtein 호출로 변환 할 Python 함수가 필요합니다. –

+0

죄송합니다, 저는 Python에서 levenshtein distance 구현을 찾고 있다는 인상을 받았습니다. 원하는 수준으로 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

하지만 왜 그걸 할까? 나를 위해, 불꽃의 주요 기능은 메모리 문제로 인해 전체 데이터베이스를로드하지 않는 것입니다 ... 나는 SQL 함수를 작성하지 않고도보다 복잡한 쿼리를 만들고 싶지만 일반적인 파이썬 구문으로 작성합니다. 그것은 이미로드 된 데이터를 조작하지 않고 사용자 사례입니다. –

+0

필자는 때때로 파이썬 인터페이스를 SQL로 변환하는 것이 유연성을주지 못하고 더 많은 해결 방법을 필요로하고 SQL에이 작업을 제공한다고 생각합니다. DB에 모든 문자열을로드하지 않아도되므로 편지를 문자 단위로로드하여 시간이 지남에 따라 메모리 요구 사항을 분산시킬 수 있습니다. –