❄️
第3回Snowflake Rookies Camp ~FrostyFriday week5~
こんばんは!
Snowflake Rookies Camp幹事のhueです。
Snowflake Rookies Camp 第3回の勉強会ハンズオン予定のFrostyFriday Week5の回答例を確認できるように事前に準備しておきました。予習・復習にご利用ください!
FrostyFriday Week5の回答例
SYSADMINロールで作業を行いたいが、SYSADMIN単体ではcompute_whの利用権限が無いため
ACCOUNTADMIN→SYSADMINに権限を付与する
use role accountadmin;
grant usage on warehouse compute_wh to role sysadmin;
compute_whの利用権限を付与したら、SQLを実行するアカウントをSYSADMINに変更する
use role sysadmin;
クエリ実行時に使用するWarehouseをcompute_whに設定する
use warehouse compute_wh;
データベースをまず定義し、その中にスキーマ・テーブルを作成する
まずはデータベース作成し、スキーマを作成します(空っぽの枠だけ)
--データベース作成
create or replace database db_week5;
--スキーマ作成
create or replace schema schema_week5;
ダミーデータを作成
create or replace table table_week5(start_int number);
insert into table_week5(start_int)
select uniform(0,100,random()) as start_int
from table(generator(rowcount => 100));
作成したデータを確認します
データはランダムに入っています。
Order byを使用して数字を順にみます。
table table_week5 order by start_int;
UDF作成
それでは、UDFを作成します。
Rookies CampではPython・SQLをそれぞれ作成します。
Python
create or replace function x3_py(i number)
returns number
language python
runtime_version = '3.12'
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
return i*3
$$;
作成されたことを確認し、使用します。
select start_int,x3_py(start_int) as start_in_x3
from table_week5
order by start_int;
SQL
create or replace function x3_sql(i number)
returns number
language sql
as
$$
i*3
$$;
使用します
select start_int,x3_sql(start_int) as start_in_x3
from table_week5
order by start_int;
Rookies Campから出題!
問題:ユーザー定義関数(UDFs)を使って身長と体重からBMIを出しましょう。
BMIは以下の計算式を使って算出します。
体重(kg)÷{身長(m)の2乗}
身長と体重のデータを作成し、BMIを計測します
テーブルを作成し、ダミーデータを入れていきます
create or replace table table_week5_bmi (height number,weight number);
insert into table_week5_bmi (height,weight)
select
uniform(150,190,random()) as height,
uniform(50,90,random()) as weight
from table(generator(rowcount => 100));
データの確認
table table_week5_bmi;
UDFの作成
Frosty Friday同様にPython・SQLをそれぞれ作成します
Python
create or replace function calc_bmi_python(height number, weight number)
returns number
language python
runtime_version = '3.12'
handler = 'calc_bmi'
as
$$
def calc_bmi(height,weight):
return weight / ((height/100)** 2)
$$;
作成を確認し、使用します。
select height,weight,calc_bmi_python(height,weight)as BMI
from table_week5_bmi;
SQL
create or replace function calc_bmi_sql(height number, weight number)
returns number
language sql
as
$$
weight / ((height / 100)*(height / 100))
$$;
使ってみます
select height,weight,calc_bmi_sql(height,weight)as BMI
from table_week5_bmi;
PythonとSQLでは2乗の算出方法が違うので注意が必要です。
コード全文
Frosty Friday Week5
--権限付与
use role accountadmin;
grant usage on warehouse compute_wh to role sysadmin;
use role sysadmin;
use warehouse compute_wh;
--DB,SCHEMA,TABLE作成
create or replace database db_week5;
create or replace schema schema_week5;
--ダミーデータ作成
create or replace table table_week5(start_int number);
insert into table_week5(start_int)
select uniform(0,100,random()) as start_int
from table(generator(rowcount => 100));
table table_week5 order by start_int;--ネタ
--UDF作成
--Python
create or replace function x3_py(i number)
returns number
language python
runtime_version = '3.12'--ネタ
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
return i*3
$$;
--使ってみる
select start_int,x3_py(start_int) as start_in_x3
from table_week5
order by start_int;
--SQL
create or replace function x3_sql(i number)
returns number
language sql
as
$$
i*3
$$;
--使ってみる
select start_int,x3_sql(start_int) as start_in_x3
from table_week5
order by start_int;
BMI
--BMI問題
--ダミーデータ作成
create or replace table table_week5_bmi (height number,weight number);
insert into table_week5_bmi (height,weight)
select
uniform(150,190,random()) as height,
uniform(50,90,random()) as weight
from table(generator(rowcount => 100));
table table_week5_bmi;
--UDF作成
--python
create or replace function calc_bmi_python(height number, weight number)
returns number
language python
runtime_version = '3.12'
handler = 'calc_bmi'
as
$$
def calc_bmi(height,weight):
return weight / ((height/100)** 2)
$$
;
--使ってみよう
select height,weight,calc_bmi_python(height,weight)as BMI
from table_week5_bmi;
--sql
create or replace function calc_bmi_sql(height number, weight number)
returns number
language sql
as
$$
weight / ((height / 100)*(height / 100))
$$;
--使ってみよう
select height,weight,calc_bmi_sql(height,weight)as BMI
from table_week5_bmi;
Discussion