CSA JMCで『変数』を活用した処理を行う #データ統合基盤 #CSアナリティクス

2020.12.24

当エントリは『クラスメソッド CSアナリティクス Advent Calendar 2020』24日目のエントリです。

当エントリでは、クラスメソッドが展開しているデータ統合基盤サービス『CSアナリティクス』(以降"CSA")のプロダクト「CSA JMC(Job Management Console)」で『変数』を活用する際の手順について紹介します。

目次

 

日々の業務で何かと便利な『変数』の存在

データ分析業務で日々バッチ処理を行っていると、バッチ処理の中で動的に変数を活用して動かしたい!というケースも良くあることかと思います。ソースコードを逐一変更するのは現実的では無いですし、あれば便利な機能とい言えるでしょう。

  • 日付に関する条件指定:当日に行う処理で「処理日の前日」を指定して何かしたい
  • 文字列や数値情報をマスタ的に扱いたい場合:任意のタイミングで変更が入るのだが、参照箇所が多いので集中管理したい部分があったりする

 

CSA JMCで利用可能な『組み込み変数』

CSA JMCでは、こういった用途要望に応えるべく『予め利用可能な"組み込み"の変数』を用意しています。利用可能な変数については、任意のサイトに移動後、メニューの[サイト管理]→[サイト変数]で遷移可能なサイト一覧から展開可能なウインドウで確認出来ます。

 

(補足)CSA Data Uploaderで利用可能な『組み込み変数』

ちなみに、同じくCSAのプロダクトである『CSA Data Uploader』でも組み込み変数が利用可能です。こちらは入出力のデータソースを設定する際のパス設定等に利用出来るものとして提供しています。

 

CSA JMCではユーザー独自の変数も作成出来ます

組み込み変数の他にも、CSA JMCではユーザー独自で定義した変数も登録・利用する事が可能です。メニューから[サイト管理]→[サイト変数]でサイト変数一覧画面に遷移し、[作成]タブを押下。

画面経由で、任意のキーと値を持つ変数を個別に登録可能です。

登録出来ました。

また、登録したい変数が複数(たくさん)ある場合、定義ファイルをインポートさせる形で変数の一括登録も可能です。以下の様な形式のファイルを用意し、拡張子を*.jsonとしたファイルを作成しておきます。

vars.json

{
  "search_event_tag": "#reinvent",
  "office_name_jp": "クラスメソッド株式会社",
  "establishment_year": "2004"
}

サイト変数一覧画面にて、[ファイルを選択]を押下。

作成したファイルを指定し、[開く]を押下。

内容を確認し、[変数をインポート]を押下。

一括登録が完了しました。

 

CSA JMC:構成要素(SQL)からの変数参照実践

ここからは、CSA JMCで変数を実際に利用する手順について紹介していきます。変数が利用出来るのは「構成要素(SQL)」と「構成要素(プログラム)」でのコード内となります。まずは「構成要素(SQL)」で利用する手順について。

構成要素(SQL)では、SQL文中内で以下の書式にて参照が可能となります。

  • 組み込み変数の場合:{{ 変数名 }}
  • ユーザー定義変数の場合:{{ vars.変数名 }}

下記SQL文はユーザー定義変数を使ってみた例です。ブログ投稿データのタイトルに「#reinvent」という値が入っているものを抽出するために、WHERE句に前述手順で登録した変数を参照する形で条件指定を行っています。

extract-reinvent-2020.sql

/** 抽出データ格納用テーブル. */
DROP TABLE IF EXISTS "cmdeviodemo"."blogposts_reinvent_2020";
CREATE TABLE IF NOT EXISTS "cmdeviodemo"."blogposts_reinvent_2020" (
  "id" integer NOT NULL
  ,"post_author" smallint encode zstd
  ,"post_date" timestamp without time zone NOT NULL
  ,"post_title" character varying(490) encode zstd
  ,"post_status" character(7) encode zstd
  ,"post_name" character varying(200) encode zstd
  ,"post_modified" timestamp without time zone encode zstd
  ,"post_type" character varying(13) encode zstd
  ,"csa_dwh_file_path" character varying(200) encode zstd
  ,"csa_dwh_created_at" timestamp without time zone encode az64
  , PRIMARY KEY ("id", "post_date")
)
DISTSTYLE key
DISTKEY ("post_type")
compound SORTKEY ("post_date", "id");

/** 実際は2020年初頭にも2019年のイベントレポートが書かれているので正確には"2020年の"では無いけれど... */
INSERT INTO cmdeviodemo.blogposts_reinvent_2020 (
SELECT * FROM cmdeviodemo.blogposts
WHERE
      DATE_PART('year',cmdeviodemo.blogposts.post_date) = 2020
  AND cmdeviodemo.blogposts.post_title LIKE '%{{ vars.search_event_tag }}%' ORDER BY post_date
);

SQL文をCSA JMC経由で登録しておき、

このSQL文を構成要素(SQL)としてジョブに登録、実行した結果(実行履歴)が以下の内容です。WHERE句の内容が意図した形で変数展開されており、クエリも正しく動いている事が確認出来ました。

 

CSA JMC:構成要素(プログラム)からの変数参照実践

続いてはPythonプログラムから変数を参照するケースについて見ていきます。

構成要素(プログラム)では、以下の手順を踏むことで変数を参照可能となります。

  • プログラム内でcsa_envをインポート
  • csa_env.get()で変数定義オブジェクトを取得
  • 取得したオブジェクトの中から所定のキーで値を取得
    • 組み込み変数の場合:['変数名']
    • ユーザー定義変数の場合:['vars']['変数名']

今回は以下の様なサンプルコードを用意してみました。上記内容を踏まえ、値を出力するだけのシンプルな内容です。

csademo.py

import csa_env

def main():
  all_vars = csa_env.get()
  office_name = str(all_vars['vars']['office_name_jp'])
  office_established = int(all_vars['vars']['establishment_year'])
  print(all_vars['today_slash'])
  print(office_name + "は" + str(office_established) + "年設立です.")
  print(all_vars)
  
if __name__ == '__main__':
    main()

こちらのコードを構成要素(プログラム)として登録し、

作成したジョブで構成要素を指定、実行。結果は以下のような内容となります。

ちなみに変数管理オブジェクトの内容を展開すると以下の様な形となります。

{
  'today': '2020-12-24',
  'today_nodash': '20201224',
  'today_slash': '2020/12/24',
  'yesterday': '2020-12-23',
  'yesterday_nodash': '20201223',
  'yesterday_slash': '2020/12/23',
  'tomorrow': '2020-12-25',
  'tomorrow_nodash': '20201225',
  'tomorrow_slash': '2020/12/25',
  'now': '2020-12-24 12:34:56',
  'now_slash': '2020/12/24 12:34:56',
  'current_year': '2020',
  'current_month': '12',
  'current_date': '24',
  'current_hour': '09',
  'current_minute': '12',
  'current_second': '11',
  'job_name': 'Pythonプログラム変数活用ジョブ',
  'schedule_unit': 'manual',
     'iam': {'redshift_role': 'arn:aws:iam::123456789012:role/xxxxxxxxxxxxxxxxxxx-role'},
  's3': {},
  'run_type': 'manual',
  'ds': '2020-12-24',
  'ds_nodash': '20201224',
  'ds_slash': '2020/12/24',
  'yesterday_ds': '2020-12-23',
  'yesterday_ds_nodash': '20201223',
  'yesterday_ds_slash': '2020/12/23',
  'tomorrow_ds': '2020-12-25',
  'tomorrow_ds_nodash': '20201225',
  'tomorrow_ds_slash': '2020/12/25',
  'task_name': 'Pythonプログラム変数活用ジョブ',
  'upload_type': 'manual',
  'vars': {
    'cm-defined-vars-string': 'クラスメソッド',
    'search_event_tag': '#reinvent',
    'office_name_jp': 'クラスメソッド株式会社',
    'establishment_year': '2004'
  }
}

 

まとめ

という訳で、『クラスメソッド CSアナリティクス Advent Calendar 2020』24本目のエントリ、「CSA JMC(Job Management Console)」でプログラムを実行する際の手順に関する内容の紹介でした。

CSA Data Uploaderは1ヶ月間のトライアル利用が可能となっています。興味をお持ち頂いた方は是非無料版ダウンロードページからインストーラを入手頂き、お試し頂けますと幸いです。また、CSA JMCに関しても下記バナーから製品ページにアクセスする事が出来ます。是非御覧ください。

では、明日最終日(25日目)のエントリもお楽しみに!