2017-07-05 7 views
0

MonetDBでのPythonとSQLの融合は、多くのビジネスロジックをデータベースサーバーに移す大きなスタートです。しかし、現在のドキュメントには、このゲームの初心者が取るべきハードルがいくつか含まれています。次の関数を考えてみましょう:MonetDBでのPython UDFの処理

sql>select * from getsourceattributes('tables'); 
+---------------+ 
| c    | 
+===============+ 
| id   | 
| name   | 
| schema_id  | 
| query   | 
| type   | 
| system  | 
| commit_action | 
| access  | 
| temporary  | 
+---------------+ 

と、次の表いくつかの統計情報を収集するために:

今PTBLがnumpyの配列であることを知って
create table dummy(tbl string, col string, stat integer); 

、私は次のことを試してみました:

create function gatherStatistics(ptbl string) 
returns string 
language python { 
    for p in ptbl: 
     attr = _conn.execute("select * from getSourceAttributes('"+ str(p) +"');") 
     for col in attr : 
      stat = _conn.execute("select count(*) from "+ str(p) +";") 
      _conn_execute("insert into dummy values('"+ str(p)+"','"+ str(col) +"',"+ str(stat)+");") 
    return ptbl; 
}; 

と電話で

select gatherstatistics('tables'); 
SELECT: no such table 't' 
Python exception 
    3.  attr = _conn.execute("select * from getSourceAttributes('"+ str(p) +"');") 
    4.  for col in attr : 

    5.  stat = _conn.execute("select count(*) from "+ str(p) +";") 

    6.  _conn_execute("insert into dummy values('"+ str(p)+"','"+ str(col) +"',"+str(stat)+");") 
    7. return ptbl; 
SQL Query Failed: ParseException:SQLparser:42S02!SELECT: no such table 't' 
  • 't'はどこから来ますか?
  • 誤認とは何ですか?

答えて

0

問題は、スカラー文字列を配列として扱うことです。 SELECTギャザリー統計( 'テーブル');を入力し、ptblの値を反復処理します。この場合、文字列 'tables'の文字を繰り返します。最初の文字は 't'です。

Python UDFの変数は、列を入力として呼び出す場合はNumPy配列、スカラ値を入力として呼び出す場合は(2)スカラ値のいずれかに変換されます。

SELECT get_type('hello'); 
+------------------+ 
| L2    | 
+==================+ 
| <type 'unicode'> | 
+------------------+ 

:今、私たちは次のような出力を得るスカラー値を使用して、それを照会場合

CREATE FUNCTION get_type(s STRING) 
RETURNS STRING 
LANGUAGE PYTHON 
{ 
    return str(type(s)) 
}; 

は、文字列として入力パラメータの型を返す次の関数を考えてみましょうしかし、列でクエリを実行すると、次の出力が得られます。

SELECT get_type(name) FROM tables; 
+------------------------+ 
| L40     | 
+========================+ 
| <type 'numpy.ndarray'> | 
+------------------------+ 

一般的に与えられたパラメータの有効な入力として1つだけを受け入れる関数を作成します。たとえば、というログという関数を作成し、数値の配列とその対数のスカラーの基数を入力として取り入れることができます。

スカラー値と配列値の両方で動作する関数を作成する場合は、入力パラメーターのタイプを調べるのが簡単な方法です。 NumPy配列でない場合は、それを1に変換します。

CREATE OR REPLACE FUNCTION reverse_string(s STRING) 
RETURNS STRING 
LANGUAGE PYTHON 
{ 
    if not isinstance(s, numpy.ndarray): 
     s = numpy.array([s]) 
    return [x[::-1] for x in s] 
}; 
SELECT reverse_string('hello'); 
+-------+ 
| L2 | 
+=======+ 
| olleh | 
+-------+ 
SELECT reverse_string(name) FROM tables LIMIT 3; 
+-----------+ 
| L40  | 
+===========+ 
| samehcs | 
| sepyt  | 
| snoitcnuf | 
+-----------+ 

たとえば、文字列を反転し、配列とスカラ値の両方で動作する、以下の機能を考慮して