Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Snowflake初心者がGA4のデータをSnowflakeに連携してみた

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for koonagi koonagi
May 18, 2023

 Snowflake初心者がGA4のデータをSnowflakeに連携してみた

【オフライン限定】Snowflakeの小技LT〜ChatGPTも知らない?秘密のテクニック教えて!〜

Avatar for koonagi

koonagi

May 18, 2023
Tweet

More Decks by koonagi

Other Decks in Technology

Transcript

  1. 自己紹介 2 山﨑 皓平(@koonagi3) 所属 ロール 趣味 好きな Snowflake の機能

    スターフェスティバル株式会社 インフラ/データ基盤エンジニア 子供/愛猫と遊ぶ Python Worksheets
  2. 【GA4 → s3】 Embulkによる取り込み設定 9 {% capture day_before_yesterday %}{{ 'today'

    | date: '%s' | minus: 172800 | date: '%Y%m%d' }}{% endcapture %} {% assign year = day_before_yesterday | slice: 0, 4 %} {% assign month = day_before_yesterday | slice: 4, 2 %} {% assign day = day_before_yesterday | slice: 6, 2 %} in: type: bigquery_extract_files project: <プロジェクト名 > json_keyfile: '/config/production/keyfile-bigquery-embulk-input.json' gcs_uri: <gcs uri> temp_local_path: /tmp/embulk/data dataset: <データセット名 > table: events_{{ day_before_yesterday }} file_format: 'NEWLINE_DELIMITED_JSON' compression: 'GZIP' decoders: - {type: gzip} parser: type: json out: type: s3_parquet bucket: <bucket_name> path_prefix: parquet/embulk/ga4_analytics_events/{{ year }}/{{ month }}/{{ day }}/data. file_ext: snappy.parquet compression_codec: snappy default_timezone: Asia/Tokyo region: ap-northeast-1 ▪ point - embulkはLiquid形式に対応してい るため、関数を利用して GA4側の パーティション分割テーブルを特定 できるようにする(テーブル名 _yyyymmdd) - 出力先のS3の日付パーティション できるように年月日でフォルダをき るようにした GA4の分割テーブルを毎日S3に連携
  3. 【s3 → Snowflake】 テーブル定義 10 <テーブル定義> RAW_DATA VARIANT, _LOAD_AT TIMESTAMP_NTZ(9),

    _LOAD_DAILY DATE ▪ point - 今後GA4側でフィールドが変更されることを考 慮して、Snowflake取り込み時には、RAWデー タをそのまま格納する - Snowflakeのメタデータから、ロード時間を取 得して格納するカラムも合わせて作成 フィールドの変更を考慮したデータロード 参考 Snowflake Snowpipeを本番導入する前 に読むやつ
  4. 【s3 → Snowflake】 データ取り込み設定 11 外部テーブル作成とデータロードのストアドを作成 し、タスクで定期実行 ▪ 外部テーブル作成のストアドから抜粋 //

    Get the date for the day before yesterday var currentDate = new Date(); currentDate.setDate(currentDate.getDate() - 2); // Format the date var year = currentDate.getFullYear(); var month = ("0" + (currentDate.getMonth() + 1)).slice(-2); // JavaScript months are 0-indexed var day = ("0" + currentDate.getDate()).slice(-2); // Generate the URL var url = `s3://<s3 bucket name >parquet/embulk/ga4_analytics_events/${year}/${month}/${day}`; ▪ point - タスク実行時に、外部テーブルを作成し、取り 込みたい日時のS3のパスを指定 - データロードでは、S3のパス配下をすべて取り 込むように - 外部テーブル作成時点で読み込み元の S3が 絞り込まれているので、実質的に日時の差分 取り込みをするようにする ▪ データロードのストアドから抜粋 COPY INTO GA4_ANALYTICS_EVENTS FROM( SELECT $1::variant as raw_data, metadata$start_scan_time::timestamp_ntz as _load_at, time_slice(_load_at, 1, 'day')::date as _load_daily FROM @GA4_ANALYTICS_EVENTS_stage