SlideShare a Scribd company logo
1 of 12
Download to read offline
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1
PL/Pythonで独⾃の集約関数を
作ってみる
アップタイム・テクノロジーズ
永安 悟史
第6回 PostgreSQLアンカンファレンス
⽬次
• なぜPL/Pythonで集約関数なのか?
• PostgreSQLにおける集約関数の作り⽅
• PL/Pythonの関数の作り⽅
• min(),max(),avg()を実装してみる
• 単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2
なぜPL/Pythonで集約関数なのか?
• Pythonとデータ処理
• データ処理と集約関数
• プロシージャ・UDFによるIn-Database処理
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
PostgreSQLにおける集約関数の作り⽅
• CREATE AGGREGATEコマンドによる定義
– 実⾏中の内部状態を処理するUDF:sfunc
– 内部状態を保持するデータ型:state_data_type
– 最終的な結果を出⼒するUDF:ffunc
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4
CREATE AGGREGATE myagg (arg1, arg2, ...)
(
SFUNC = sfunc,
STYPE = state_data_type,
FINALFUNC = ffunc
);
ユーザ定義の集約
https://www.postgresql.jp/document/9.4/html/xaggr.html
CREATE AGGREGATE
https://www.postgresql.jp/document/9.4/html/sql-createaggregate.html
sfunc
args
state
sfunc
args
state
ffunc
return
PL/Pythonの関数の作り⽅
• CREATE FUNCTION
– 単に中⾝がPythonスクリプトになるだけ
• データベースにアクセスする場合には plpy モジュール
– CのUDFで⾔うところのSPI関数のようなもの
– import plpy
• 注意すべきところ
– plpython.soからリンクされているPythonのバージョン
– データの相互マッピング(+エンコーディング)
– ステート変数の global 宣⾔(変更するには global が必要。後述)
– そもそも superuser しか使えない(untrusted なので)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 5
PL/Python - Python⼿続き⾔語
https://www.postgresql.jp/document/9.4/html/plpython.html
PL/Pythonの関数の作り⽅
• 外部のPythonモジュールを使うUDFの例
– ⽇本語⾃動要約ライブラリ
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6
⾃動要約API「summpy」を使ってPostgreSQLに⽂章の要約機能を追加する
http://pgsqldeepdive.blogspot.jp/2015/11/pgsummpy.html
CREATE FUNCTION lexrank_summarize(p text, t text, s_limit integer)
RETURNS SETOF text
AS $$
import sys
sys.path.append(p)
from summpy import lexrank
res = lexrank.summarize(unicode(t, 'utf‐8'), sent_limit=s_limit)
for s in res:
yield(s.encode('utf‐8'))
$$ LANGUAGE plpythonu;
min(),max(),avg()を実装してみる
• 組み込みのmin(), max(), avg() の機能を再現
– 集約関数名は pymin(), pymax(), pyavg()
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7
‐‐ min()
‐‐ sがstate変数、nが入力値、最後の計算は不要なのでffuncは無し
CREATE FUNCTION float8_pymin(s float8, n float8)
RETURNS float8
AS $$
global s
if n is not None:
if s is None or n < s:
s = n
return s
$$ LANGUAGE plpython2u;
CREATE AGGREGATE pymin (float8)
(
sfunc = float8_pymin,
stype = float8
);
min(),max(),avg()を実装してみる
• avg() のPL/Python実装
– ffunc を追加して、最後に平均値を計算して出⼒
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8
‐‐
‐‐ avg()
‐‐
CREATE FUNCTION float8_pyavg(
s float8[], n float8)
RETURNS float8[]
AS $$
global s
if n is not None:
if s is None:
# sum,count
s = [0,0]
s[0] = s[0] + n
s[1] = s[1] + 1
return s
$$ LANGUAGE plpython2u;
CREATE FUNCTION float8_pyavg_final(
s float8[])
RETURNS float8
AS $$
global s
if s is not None:
return s[0]/s[1]
return None
$$ LANGUAGE plpython2u;
CREATE AGGREGATE pyavg (float8)
(
sfunc = float8_pyavg,
stype = float8[],
finalfunc = float8_pyavg_final
);
pyagg.sql https://gist.github.com/snaga/7c3940e72fad172cca6f
単回帰分析を⾏う集約関数を実装してみる
• 単回帰分析のモデルは y = w0 + w1 * x
• データを⼆種類⽤意する(訓練⽤、評価⽤)
• 訓練⽤データのテーブルから y と x を拾う
– w0 と w1 を集約関数で計算して出⼒する
• 別のテーブルの評価⽤データの x から y を予測する
• 結果および誤差を確認する
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9
Machine Learning: Regression - University of Washington | Coursera
https://www.coursera.org/learn/ml-regression/
単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 10
snaga=# ¥d
List of relations
Schema |        Name         | Type  | Owner
‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐
public | kc_house_data | table | snaga
public | kc_house_test_data | table | snaga
public | kc_house_train_data | table | snaga
(3 rows)
snaga=# select simple_linear_regression(price,sqft_living) from 
kc_house_train_data;
simple_linear_regression
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
{‐47116.0791388,281.958839662}
(1 row)
• デモ
snaga/SimpleLinearRegression
https://github.com/snaga/SimpleLinearRegression
単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11
snaga=# select sqft_living,
price,
round(‐47116.0791388 + 281.958839662 * sqft_living) as 
price_predicted,
round((((‐47116.0791388 + 281.958839662 * sqft_living) ‐ price) / 
price)::numeric, 2) as error
from kc_house_test_data;
sqft_living | price  | price_predicted | error
‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐
1430 | 310000 |          356085 |  0.15
2950 | 650000 |          784662 |  0.21
1710 | 233000 |          435034 |  0.87
(...)
2310 | 400000 |          604209 |  0.51
1020 | 402101 |          240482 | ‐0.40
(4229 rows)
• デモ
snaga/SimpleLinearRegression
https://github.com/snaga/SimpleLinearRegression
Q&A
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12
コメント、質問など
Twitter: @snaga
E-Mail: snaga@uptime.jp

More Related Content

What's hot

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介bitbank, Inc. Tokyo, Japan
 
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
さくっとはじめるテキストマイニング(R言語)  スタートアップ編さくっとはじめるテキストマイニング(R言語)  スタートアップ編
さくっとはじめるテキストマイニング(R言語)  スタートアップ編Yutaka Shimada
 
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送Google Cloud Platform - Japan
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話Preferred Networks
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニングyoku0825
 
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話mariydi1
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)NTT DATA OSS Professional Services
 
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpsonickun
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめtakezoe
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyAtsuki Yokota
 
「情報」を「書く」ということ(仮) #RedmineJapan
 「情報」を「書く」ということ(仮)  #RedmineJapan 「情報」を「書く」ということ(仮)  #RedmineJapan
「情報」を「書く」ということ(仮) #RedmineJapanKazuhito Miura
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...Holden Karau
 

What's hot (20)

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
 
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
さくっとはじめるテキストマイニング(R言語)  スタートアップ編さくっとはじめるテキストマイニング(R言語)  スタートアップ編
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
 
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
初心者がRSA暗号を教わったら自力でCTFの問題が解けるようになった話
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
 
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめ
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
 
Apache Spark 2.4 and 3.0 What's Next?
Apache Spark 2.4 and 3.0  What's Next? Apache Spark 2.4 and 3.0  What's Next?
Apache Spark 2.4 and 3.0 What's Next?
 
「情報」を「書く」ということ(仮) #RedmineJapan
 「情報」を「書く」ということ(仮)  #RedmineJapan 「情報」を「書く」ということ(仮)  #RedmineJapan
「情報」を「書く」ということ(仮) #RedmineJapan
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
 

Viewers also liked

20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料kasaharatt
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)kasaharatt
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料kasaharatt
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etckasaharatt
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)Uptime Technologies LLC (JP)
 

Viewers also liked (8)

20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
 
Postgres Toolkit
Postgres ToolkitPostgres Toolkit
Postgres Toolkit
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 

Similar to PL/Pythonで独自の集約関数を作ってみる

[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...Insight Technology, Inc.
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanShigeru Hanada
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
20140120 presto meetup
20140120 presto meetup20140120 presto meetup
20140120 presto meetupOgibayashi
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Kenta Oono
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data scienceTakami Sato
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!NTT DATA Technology & Innovation
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitSeiya Mizuno
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)Photon運営事務局
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大openrtm
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発shoma h
 
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...Shotaro Suzuki
 
JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)Chika SATO
 

Similar to PL/Pythonで独自の集約関数を作ってみる (20)

[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
20140120 presto meetup
20140120 presto meetup20140120 presto meetup
20140120 presto meetup
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
PostreSQL監査
PostreSQL監査PostreSQL監査
PostreSQL監査
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
 
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
 
JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)
 
PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介
 

More from Uptime Technologies LLC (JP)

pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法Uptime Technologies LLC (JP)
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告Uptime Technologies LLC (JP)
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)Uptime Technologies LLC (JP)
 
Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Technologies LLC (JP)
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13Uptime Technologies LLC (JP)
 

More from Uptime Technologies LLC (JP) (11)

pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビュー
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
 
PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5
 

PL/Pythonで独自の集約関数を作ってみる

  • 1. Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1 PL/Pythonで独⾃の集約関数を 作ってみる アップタイム・テクノロジーズ 永安 悟史 第6回 PostgreSQLアンカンファレンス
  • 2. ⽬次 • なぜPL/Pythonで集約関数なのか? • PostgreSQLにおける集約関数の作り⽅ • PL/Pythonの関数の作り⽅ • min(),max(),avg()を実装してみる • 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2
  • 3. なぜPL/Pythonで集約関数なのか? • Pythonとデータ処理 • データ処理と集約関数 • プロシージャ・UDFによるIn-Database処理 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
  • 4. PostgreSQLにおける集約関数の作り⽅ • CREATE AGGREGATEコマンドによる定義 – 実⾏中の内部状態を処理するUDF:sfunc – 内部状態を保持するデータ型:state_data_type – 最終的な結果を出⼒するUDF:ffunc Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4 CREATE AGGREGATE myagg (arg1, arg2, ...) ( SFUNC = sfunc, STYPE = state_data_type, FINALFUNC = ffunc ); ユーザ定義の集約 https://www.postgresql.jp/document/9.4/html/xaggr.html CREATE AGGREGATE https://www.postgresql.jp/document/9.4/html/sql-createaggregate.html sfunc args state sfunc args state ffunc return
  • 5. PL/Pythonの関数の作り⽅ • CREATE FUNCTION – 単に中⾝がPythonスクリプトになるだけ • データベースにアクセスする場合には plpy モジュール – CのUDFで⾔うところのSPI関数のようなもの – import plpy • 注意すべきところ – plpython.soからリンクされているPythonのバージョン – データの相互マッピング(+エンコーディング) – ステート変数の global 宣⾔(変更するには global が必要。後述) – そもそも superuser しか使えない(untrusted なので) Copyright 2015 Uptime Technologies, LLC. All rights reserved. 5 PL/Python - Python⼿続き⾔語 https://www.postgresql.jp/document/9.4/html/plpython.html
  • 6. PL/Pythonの関数の作り⽅ • 外部のPythonモジュールを使うUDFの例 – ⽇本語⾃動要約ライブラリ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6 ⾃動要約API「summpy」を使ってPostgreSQLに⽂章の要約機能を追加する http://pgsqldeepdive.blogspot.jp/2015/11/pgsummpy.html CREATE FUNCTION lexrank_summarize(p text, t text, s_limit integer) RETURNS SETOF text AS $$ import sys sys.path.append(p) from summpy import lexrank res = lexrank.summarize(unicode(t, 'utf‐8'), sent_limit=s_limit) for s in res: yield(s.encode('utf‐8')) $$ LANGUAGE plpythonu;
  • 7. min(),max(),avg()を実装してみる • 組み込みのmin(), max(), avg() の機能を再現 – 集約関数名は pymin(), pymax(), pyavg() Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7 ‐‐ min() ‐‐ sがstate変数、nが入力値、最後の計算は不要なのでffuncは無し CREATE FUNCTION float8_pymin(s float8, n float8) RETURNS float8 AS $$ global s if n is not None: if s is None or n < s: s = n return s $$ LANGUAGE plpython2u; CREATE AGGREGATE pymin (float8) ( sfunc = float8_pymin, stype = float8 );
  • 8. min(),max(),avg()を実装してみる • avg() のPL/Python実装 – ffunc を追加して、最後に平均値を計算して出⼒ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8 ‐‐ ‐‐ avg() ‐‐ CREATE FUNCTION float8_pyavg( s float8[], n float8) RETURNS float8[] AS $$ global s if n is not None: if s is None: # sum,count s = [0,0] s[0] = s[0] + n s[1] = s[1] + 1 return s $$ LANGUAGE plpython2u; CREATE FUNCTION float8_pyavg_final( s float8[]) RETURNS float8 AS $$ global s if s is not None: return s[0]/s[1] return None $$ LANGUAGE plpython2u; CREATE AGGREGATE pyavg (float8) ( sfunc = float8_pyavg, stype = float8[], finalfunc = float8_pyavg_final ); pyagg.sql https://gist.github.com/snaga/7c3940e72fad172cca6f
  • 9. 単回帰分析を⾏う集約関数を実装してみる • 単回帰分析のモデルは y = w0 + w1 * x • データを⼆種類⽤意する(訓練⽤、評価⽤) • 訓練⽤データのテーブルから y と x を拾う – w0 と w1 を集約関数で計算して出⼒する • 別のテーブルの評価⽤データの x から y を予測する • 結果および誤差を確認する Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9 Machine Learning: Regression - University of Washington | Coursera https://www.coursera.org/learn/ml-regression/
  • 10. 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 10 snaga=# ¥d List of relations Schema |        Name         | Type  | Owner ‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐ public | kc_house_data | table | snaga public | kc_house_test_data | table | snaga public | kc_house_train_data | table | snaga (3 rows) snaga=# select simple_linear_regression(price,sqft_living) from  kc_house_train_data; simple_linear_regression ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ {‐47116.0791388,281.958839662} (1 row) • デモ snaga/SimpleLinearRegression https://github.com/snaga/SimpleLinearRegression
  • 11. 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11 snaga=# select sqft_living, price, round(‐47116.0791388 + 281.958839662 * sqft_living) as  price_predicted, round((((‐47116.0791388 + 281.958839662 * sqft_living) ‐ price) /  price)::numeric, 2) as error from kc_house_test_data; sqft_living | price  | price_predicted | error ‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐ 1430 | 310000 |          356085 |  0.15 2950 | 650000 |          784662 |  0.21 1710 | 233000 |          435034 |  0.87 (...) 2310 | 400000 |          604209 |  0.51 1020 | 402101 |          240482 | ‐0.40 (4229 rows) • デモ snaga/SimpleLinearRegression https://github.com/snaga/SimpleLinearRegression
  • 12. Q&A Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12 コメント、質問など Twitter: @snaga E-Mail: snaga@uptime.jp