SnowflakeのRESULT_SCAN関数を使ってみた

2020.10.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

Snowflakeのテーブル関数の1つにRESULT_SCANという関数があります。この関数が結構便利そうだったので今回試してみました。

RESULT_SCAN関数とは?

RESULT_SCAN関数は、以前に実行したコマンドの結果を「結果セット」として返してくれる関数です。

例えばSHOW REGIONSコマンドですが、このコマンドはSHOW系のコマンドなので細かい結果の制御はできません。

これに対して、RESULT_SCAN関数を併用すると、WHERE句での絞り込みや、ORDER BYでの並び替えができるようになります。なお、注意点としてRESULT_SCAN関数を利用したクエリ実行には仮想ウェアハウスを必要とするので、その点には注意が必要です。

試してみた

ということで、具体的にどのように使うのかRESULT_SCAN関数を試してみました。今回はSHOW REGIONSコマンドと併用して色々試してみます。

RESULT_SCAN関数の構文は以下の通り、クエリIDを明示的に指定するか、LAST_QUERY_ID()を利用してクエリIDを取得するかのどちらかになります。今回はLAST_QUERY_ID()を利用してみます。

RESULT_SCAN ( { '<query_id>'  | LAST_QUERY_ID() } )

まずは単純にSHOW REGIONSコマンドの実行結果の確認です。

SHOW REGIONS;
╒═════════════════════╤═══════╤════════════════╕
│ snowflake_region    │ cloud │ region         │
╞═════════════════════╪═══════╪════════════════╡
│ AWS_US_WEST_2       │ aws   │ us-west-2      │
├─────────────────────┼───────┼────────────────┤
│ AWS_US_EAST_1       │ aws   │ us-east-1      │
├─────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTHEAST_2  │ aws   │ ap-southeast-2 │
├─────────────────────┼───────┼────────────────┤
│ AWS_EU_WEST_1       │ aws   │ eu-west-1      │
├─────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTHEAST_1  │ aws   │ ap-southeast-1 │
├─────────────────────┼───────┼────────────────┤
│ AWS_CA_CENTRAL_1    │ aws   │ ca-central-1   │
├─────────────────────┼───────┼────────────────┤
│ AWS_EU_CENTRAL_1    │ aws   │ eu-central-1   │
├─────────────────────┼───────┼────────────────┤
│ AWS_US_EAST_2       │ aws   │ us-east-2      │
├─────────────────────┼───────┼────────────────┤
│ AWS_AP_NORTHEAST_1  │ aws   │ ap-northeast-1 │
├─────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTH_1      │ aws   │ ap-south-1     │
├─────────────────────┼───────┼────────────────┤
│ AZURE_EASTUS2       │ azure │ eastus2        │
├─────────────────────┼───────┼────────────────┤
│ AZURE_WESTEUROPE    │ azure │ westeurope     │
├─────────────────────┼───────┼────────────────┤
│ AZURE_AUSTRALIAEAST │ azure │ australiaeast  │
├─────────────────────┼───────┼────────────────┤
│ AZURE_CANADACENTRAL │ azure │ canadacentral  │
├─────────────────────┼───────┼────────────────┤
│ AZURE_SOUTHEASTASIA │ azure │ southeastasia  │
├─────────────────────┼───────┼────────────────┤
│ AZURE_WESTUS2       │ azure │ westus2        │
├─────────────────────┼───────┼────────────────┤
│ AZURE_SWITZERLANDN  │ azure │ switzerlandn   │
├─────────────────────┼───────┼────────────────┤
│ GCP_US_CENTRAL1     │ gcp   │ us-central1    │
├─────────────────────┼───────┼────────────────┤
│ GCP_EUROPE_WEST2    │ gcp   │ europe-west2   │
├─────────────────────┼───────┼────────────────┤
│ GCP_EUROPE_WEST4    │ gcp   │ europe-west4   │
╘═════════════════════╧═══════╧════════════════╛

ここで、cloudawsのものに限定するように、RESULT_SCAN関数を使ってクエリを掛けてみます。

SELECT
  "snowflake_region",
  "cloud",
  "region"
FROM
  TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE
  "cloud" = 'aws'
;

FROM句の箇所でRESULT_SCAN関数を利用しています。また、更にTABLE関数を利用してRESULT_SCANの結果を行のセットとして利用しています。なお、カラム名の定義が小文字なので、カラム名はダブルクォーテーションで括っています。

結果は以下の通りとなり、ちゃんと絞り込みできていますね。

╒════════════════════╤═══════╤════════════════╕
│ snowflake_region   │ cloud │ region         │
╞════════════════════╪═══════╪════════════════╡
│ AWS_US_WEST_2      │ aws   │ us-west-2      │
├────────────────────┼───────┼────────────────┤
│ AWS_US_EAST_1      │ aws   │ us-east-1      │
├────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTHEAST_2 │ aws   │ ap-southeast-2 │
├────────────────────┼───────┼────────────────┤
│ AWS_EU_WEST_1      │ aws   │ eu-west-1      │
├────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTHEAST_1 │ aws   │ ap-southeast-1 │
├────────────────────┼───────┼────────────────┤
│ AWS_CA_CENTRAL_1   │ aws   │ ca-central-1   │
├────────────────────┼───────┼────────────────┤
│ AWS_EU_CENTRAL_1   │ aws   │ eu-central-1   │
├────────────────────┼───────┼────────────────┤
│ AWS_US_EAST_2      │ aws   │ us-east-2      │
├────────────────────┼───────┼────────────────┤
│ AWS_AP_NORTHEAST_1 │ aws   │ ap-northeast-1 │
├────────────────────┼───────┼────────────────┤
│ AWS_AP_SOUTH_1     │ aws   │ ap-south-1     │
╘════════════════════╧═══════╧════════════════╛

今度は、cloudgcpのものに限定した上で、region順で並び替えます。LAST_QUERY_ID()を利用するので、先に再度SHOW REGIONSを実行してからSELECTします。

SHOW REGIONS;
SELECT
  "snowflake_region",
  "cloud",
  "region"
FROM
  TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE
  "cloud" = 'gcp'
ORDER BY
  "region"
;

以下の結果となりました。バッチリですね!

╒══════════════════╤═══════╤══════════════╕
│ snowflake_region │ cloud │ region       │
╞══════════════════╪═══════╪══════════════╡
│ GCP_EUROPE_WEST2 │ gcp   │ europe-west2 │
├──────────────────┼───────┼──────────────┤
│ GCP_EUROPE_WEST4 │ gcp   │ europe-west4 │
├──────────────────┼───────┼──────────────┤
│ GCP_US_CENTRAL1  │ gcp   │ us-central1  │
╘══════════════════╧═══════╧══════════════╛

まとめ

以上、RESULT_SCAN関数を試してみました。SHOW系のコマンドの結果を細かく制御して取得したり、別のクエリのデータソースとしたい場合にとても便利ですね。

どなたかのお役に立てば幸いです。それでは!