🛖

SnowPro Associate資格への道 ~Part4:半構造化データ~

に公開

はじめに

9月のSnowflake World Tour TokyoまでにSnowPro Coreをとります!
試験日8月28日までいよいよ、38日。
やばいもうすぐ1か月切っちゃう💦

閑話休題 Associate試験について

とその前に、7月にSnowflake Platform Trainingを受けました(今週開催分は満席のようです💦)。
Snowflake Platform Trainingを受講してアンケートに回答すると、SnowPro Associateのバウチャーがもらえます。

ぜひ資格試験に興味がある方やSnowflake World Tour Tokyoで資格取得者専用ラウンジに入りたい、Tシャツをゲットしたい方は次回のSnowflake Platform Trainingも要チェック!

というわけで前置きが長くなりましたが、SnowPro Coreを受ける前にAssociate試験を受けちゃおうということで、横道にそれている今日この頃です。

現在こちらのUdemyの問題を解いています。
SnowPro Associate: Platform Certification – Practice Exams

半構造化データについて

あれ、非構造化データと半構造化データがごっちゃになっている、と気づいた私は新たにブログを書くことにしました。

https://docs.snowflake.com/en/user-guide/semistructured-intro

半構造化データは、従来の構造化データの標準に準拠していないが、データ内の個々の異なるエンティティを識別するタグ (ラベル) またはその他の種類のマークアップを含むデータです。
半構造化データと構造化データを区別する主な属性の 2 つは、ネストされたデータ構造固定スキーマがないことです。

半構造化データとは、CSVのような「構造化データ」と、テキストファイルのような「非構造化データ」の中間に位置するデータ形式のことです。

  • 構造化データ: 行と列でカッチリ定義されたデータ(例: CSV、RDBのテーブル)
  • 非構造化データ: 決まった形を持たないデータ(例: テキスト、画像、音声)

半構造化データは、データ自体に階層構造やキーと値のペアといった形で構造の情報が含まれているのが大きな特徴です。これにより、構造化データほどの厳密さはないものの、柔軟にデータを表現できます。

半構造化データの代表的なファイル形式

Web APIのレスポンスやログデータなど、私たちが日常的に触れる多くのデータは半構造化データです。代表的なファイル形式には以下のようなものがあります。

ファイル形式 概要 特徴
JSON JavaScript Object Notationの略。{}で囲まれたキーと値のペアでデータを表現します。Web APIで最も広く使われています。 軽量で人間にも読み書きしやすい。階層構造を表現するのが得意。
Avro スキーマ(データの構造定義)を持つバイナリ形式のデータ。 スキーマがあるため、データの信頼性が高い。大規模データ処理に強い。
Parquet 列指向で格納されるバイナリ形式のデータ。 分析クエリのパフォーマンスが非常に高い。DWHでよく利用される。
ORC Parquet同様、列指向で格納されるバイナリ形式のデータ。 高い圧縮率と高速な読み込みを実現。

半構造化データを構造化する

https://docs.snowflake.com/ja/sql-reference/functions/flatten
複合値を複数の行にフラット化(展開)します。

FLATTEN関数は、JSONの配列([]で囲まれたリスト)のような半構造化データの中の繰り返し要素を、行に展開するための専用関数です。
下記のようなjsonファイルがあった場合に

{
  "user_id": 123,
  "user_name": "Sato",
  "items": [
    { "item_name": "apple", "price": 150 },
    { "item_name": "orange", "price": 120 }
  ]
}
SELECT
  v:user_id::INT AS user_id,
  v:user_name::STRING AS user_name,
  f.value:item_name::STRING AS item_name,
  f.value:price::INT AS price
FROM
  your_table,
  LATERAL FLATTEN(input => v:items) AS f;

LATERAL FLATTEN(input => v:items) を使うことで、items配列の中身を一つ一つの行に分解できます。
上記のSQLの出力イメージです。

user_id user_name item_name price
123 Sato apple 150
123 Sato orange 120

VARIANTに格納されている半構造化の考慮事項

https://docs.snowflake.com/ja/user-guide/semistructured-considerations
NULL値についてですが、SQLでNULLとするとnullが返ってきますが、
JSONでNULLが指定されている場合は文字列の【NULL】が返ってくるそうです。

SELECT 
  PARSE_JSON(NULL) AS "SQL NULL", 
  PARSE_JSON('null') AS "JSON NULL", 
  PARSE_JSON('[ null ]') AS "JSON NULL",
  PARSE_JSON('{ "a": null }'):a AS "JSON NULL",
  PARSE_JSON('{ "a": null }'):b AS "ABSENT VALUE";

まとめ

ここで難しいって言っていたらCoreはもっと難しくなっちゃうので、Associateできっちり基礎を固めてCoreを目指していきたいと思います。
がんばるぞー!

Discussion