Frosty Friday Week5 Basic UDFs
こんばんは。m.fujitaです。
今日はWeek5を解いてみます。
Frosty Fridayとは
Frosty Friday Live Challenge Vol 2
解説のYoutubeはこちらにあります。
Week5の問題
英語で書かれているのですが、日本語で翻訳して転記します。
UDFとは
まず、UDFがよく分からなかったのでChatGPTに聞いてみました。
なるほど、関数ってことですね。共通処理があったときに別の場所から1か所に呼び出すときとか、ロジックの可読性を上げるときに役に立つものと理解しています。
さて解いてみよう
まずはここまで自分で考えながらやってみました。
Table句使ってみた過ぎて使ってみた。めっちゃ楽しいです。
でも、結果を3倍にしなきゃいけないのにすごい大きいor小さい数値が出ちゃっています💦
CREATE or replace TABLE FROSTY_FRIDAY.FROSTY.ff_week5_raw (
RANDOM_NUMBER NUMBER -- ランダムな数値
);
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
-- 100行のデータを挿入
INSERT INTO FROSTY_FRIDAY.FROSTY.ff_week5_raw (RANDOM_NUMBER)
SELECT
RANDOM() * 100 AS RANDOM_NUMBER
FROM TABLE(GENERATOR(ROWCOUNT => 100)) AS T;
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
動画視聴開始!
がくさんの解法を視聴してみました。
どうやら間違っていたのは1行だけだったようです。
-- 100行のデータを挿入
INSERT INTO FROSTY_FRIDAY.FROSTY.ff_week5_raw (RANDOM_NUMBER)
SELECT
-- RANDOM() * 100 AS RANDOM_NUMBER
uniform(0,1000,random()) as RANDOM_NUMBER
FROM TABLE(GENERATOR(ROWCOUNT => 100)) AS T;
UNIFORM?!
テストデータを作るときに生成する関数ってことですね。
ChatGPTさんに聞いたこの解説がすごく分かりやすかったです。
そして↓のサンプルコードがほぼそのまんま。
動画内ではGENERATOR関数がテストデータを作る際にとても便利ですとのことだったので、UNIFORM関数とセットで使われるのかを聞いてみました。
GENERATOR関数の横の=>
不等号だと思っていたのです。100行作りたいと言っているのに=>って100行以上データができてしまうのでは?と疑問に思ったのです。
パラメータだったのか!初めて知りました・・・!
これは後々よく使いそうですね!覚えられないので後で自分のnoteを調べに来ますw
途中から動かなくなった
PythonでFunctionを作ってみました。
あれあれ?その後から動かなくなりました。
どうやら、途中で実行しているロールが変更されてしまったようです。
イチからやり直すことにしました。
use schema frosty_friday.frosty;
use role sysadmin;
CREATE or replace TABLE FROSTY_FRIDAY.FROSTY.ff_week5_raw (
RANDOM_NUMBER NUMBER -- ランダムな数値
);
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
truncate table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
-- 100行のデータを挿入
INSERT INTO FROSTY_FRIDAY.FROSTY.ff_week5_raw (RANDOM_NUMBER)
SELECT
-- RANDOM() * 100 AS RANDOM_NUMBER
uniform(0,1000,random()) as RANDOM_NUMBER
FROM TABLE(GENERATOR(ROWCOUNT => 100)) AS T;
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
--Pythonで関数を作って3倍の値を入れてみる
create or replace function FROSTY_FRIDAY.FROSTY.timesthree(i int)
returns int
language python
runtime_version = '3.11'
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
return i*3
$$
;
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
select RANDOM_NUMBER,
FROSTY_FRIDAY.FROSTY.timesthree(RANDOM_NUMBER) as RANDOM_NUMBER_x3
from FROSTY_FRIDAY.FROSTY.ff_week5_raw
order by RANDOM_NUMBER;
できたーーー!(歓喜)
Functionを作るときの$$はなにか?
最終的なコード
use schema frosty_friday.frosty;
use role sysadmin;
CREATE or replace TABLE FROSTY_FRIDAY.FROSTY.ff_week5_raw (
RANDOM_NUMBER NUMBER -- ランダムな数値
);
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
truncate table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
-- 100行のデータを挿入
INSERT INTO FROSTY_FRIDAY.FROSTY.ff_week5_raw (RANDOM_NUMBER)
SELECT
-- RANDOM() * 100 AS RANDOM_NUMBER
uniform(0,1000,random()) as RANDOM_NUMBER
FROM TABLE(GENERATOR(ROWCOUNT => 100)) AS T;
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
//==========================================================================
--Pythonで関数を作って3倍の値を入れてみる
create or replace function FROSTY_FRIDAY.FROSTY.timesthree(i int)
returns int
language python
runtime_version = '3.11'
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
return i*3
$$
;
table FROSTY_FRIDAY.FROSTY.ff_week5_raw ;
--3倍の値は、FROSTY_FRIDAY.FROSTY.timesthree(i)から関数に飛ばすことでうまく計算される
select RANDOM_NUMBER,
FROSTY_FRIDAY.FROSTY.timesthree(RANDOM_NUMBER) as RANDOM_NUMBER_x3
from FROSTY_FRIDAY.FROSTY.ff_week5_raw
order by RANDOM_NUMBER;
//==========================================================================
--SQLで関数を作ってみる
create or replace function FROSTY_FRIDAY.FROSTY.SQL_timesthree(i int)
returns int
language sql
as
$$
i*3
$$
;
--内容を確認
--3倍の値は、FROSTY_FRIDAY.FROSTY.timesthree(i)から関数に飛ばすことでうまく計算される
select RANDOM_NUMBER,
FROSTY_FRIDAY.FROSTY.SQL_timesthree(RANDOM_NUMBER) as RANDOM_NUMBER_SQLx3
from FROSTY_FRIDAY.FROSTY.ff_week5_raw
order by RANDOM_NUMBER;
番外編
さっそくWeek1やWeek3で学んだステージの内容を取得する方法が業務にも役に立ちました。学んだことが仕事に役に立つとさらにモチベーションがあがりますね✨
まとめ
問題文とフィールド名が異なってしまったのはご愛敬で。
目的となるFunctionの作成ができました。
・UNIFORM
・GENERATOR
・Function(python)
・Function(SQL)
の使い方を学びました。
Basicなら長く続けられそう!3回続きました。
Snowflakeを自分で勉強しようとしたら思考停止していた2024年の自分からするとすごい成長です。
引き続き発信していくので、皆様よろしくお願いいたします。