Snowflake SQL 変換ガイド
このドキュメントでは、エンタープライズ データ ウェアハウス(EDW)から BigQuery への移行をスムーズに行えるように、Snowflake と BigQuery の SQL 構文の類似点と違いについて詳しく説明します。Snowflake データ ウェアハウジングは、Snowflake 固有の SQL 構文で動作するように設計されています。サービスによって SQL 言語に違いがあるため、Snowflake 用に作成したスクリプトをそのまま BigQuery で使用できない場合があります。バッチ SQL 変換を使用して SQL スクリプトを一括で移行することも、インタラクティブ SQL 変換を使用してアドホック クエリを変換することもできます。Snowflake SQL は、プレビューでは両方のツールでサポートされています。
データ型
このセクションでは、Snowflake と BigQuery の間で対応するデータ型を示します。
Snowflake | BigQuery | 注 |
---|---|---|
NUMBER/
DECIMAL/NUMERIC |
NUMERIC |
Snowflake の NUMBER データ型は、38 桁の精度と 37 桁のスケールをサポートします。精度とスケールはユーザーに従って指定できます。BigQuery では、 NUMERIC と BIGNUMERIC を一定の範囲で任意に指定された精度とスケールでサポートします。 |
INT/INTEGER |
BIGNUMERIC |
INT/INTEGER などの INT のようなデータ型(BIGINT, TINYINT, SMALLINT, BYTEINT など)はすべて、精度とスケールを指定できず、常に NUMBER(38, 0) である NUMBER データ型のエイリアスを表します。 |
BIGINT |
BIGNUMERIC |
|
SMALLINT |
BIGNUMERIC |
|
TINYINT |
BIGNUMERIC |
|
BYTEINT |
BIGNUMERIC |
|
FLOAT/ |
FLOAT64 |
Snowflake の FLOAT データ型は、「NaN」を X より大きい値に設定します。ここで、X は任意の FLOAT 値です(NaN 自体を除く)。BigQuery の FLOAT データ型は、「NaN」を X より大きい値に設定します。ここで、X は任意の FLOAT 値です(NaN 自体を除く)。 |
DOUBLE/ REAL |
FLOAT64 |
Snowflake の DOUBLE データ型は Snowflake の FLOAT データ型と同義ですが、誤って FLOAT と表示されることがよくあります。これは DOUBLE として適切に保存されています。 |
VARCHAR |
STRING |
Snowflake の VARCHAR データ型の最大長は 16 MB(非圧縮)です。長さが指定されていない場合、デフォルトは最大長です。BigQuery の STRING 型は、可変長の UTF-8 エンコードされた Unicode として保存されます。最大長は 16,000 文字です。 |
CHAR/CHARACTER |
STRING |
Snowflake の CHAR データ型の最大長は 1 です。 |
STRING/TEXT |
STRING |
Snowflake の STRING データ型は、Snowflake の VARCHAR と同義です。 |
BINARY |
BYTES |
|
VARBINARY |
BYTES |
|
BOOLEAN |
BOOL |
BigQuery の BOOL データ型は TRUE/FALSE のみを受け入れます。これは、TRUE/FALSE/NULL を受け入れる Snowflake の BOOL データ型とは異なります。 |
DATE |
DATE |
Snowflake の DATE 型は、ほとんどの日付形式を受け入れます。これは、「YYYY-[M]M-[D]D」形式の日付のみを受け入れる BigQuery の DATE 型とは異なります。 |
TIME |
TIME |
Snowflake の TIME 型は 0~9 ナノ秒の精度をサポートしますが、BigQuery の TIME 型は 0~6 ナノ秒の精度をサポートします。 |
TIMESTAMP |
DATETIME |
TIMESTAMP はユーザーが構成可能なエイリアスで、デフォルトは BigQuery の DATETIME に対応する TIMESTAMP_NTZ です。 |
TIMESTAMP_LTZ |
TIMESTAMP |
|
TIMESTAMP_NTZ/DATETIME |
DATETIME |
|
TIMESTAMP_TZ |
TIMESTAMP |
|
OBJECT |
JSON |
Snowflake の OBJECT 型は、明示的に型指定された値をサポートしていません。値の型は VARIANT です。 |
VARIANT |
JSON |
Snowflake の OBJECT 型は、明示的に型指定された値をサポートしていません。値の型は VARIANT です。 |
ARRAY |
ARRAY<JSON> |
Snowflake の ARRAY 型は VARIANT 型のみをサポートでき、BigQuery の ARRAY 型は配列自体を除くすべてのデータ型をサポートできます。 |
BigQuery には次のデータ型もあります。これらのデータ型に直接対応する Snowflake データ型はありません。
クエリ構文とクエリ演算子
ここでは、Snowflake と BigQuery のクエリ構文の違いについて説明します。
SELECT
ステートメント
Snowflake の SELECT
ステートメントのほとんどは、BigQuery と互換性があります。次の表に細かな違いの一覧を示します。
Snowflake | BigQuery | |
---|---|---|
|
|
|
注: Snowflake では、同じ SELECT ステートメント内でのエイリアスの作成と参照がサポートされます。 |
|
|
|
|
デフォルトでは、Snowflake のエイリアスと識別子では大文字と小文字が区別されません。大文字と小文字を区別するには、エイリアスと識別子を二重引用符(")で囲みます。
BigQuery では SELECT
ステートメントで次の式がサポートされています。これらと同等の Snowflake の式はありません。
FROM
句
クエリの FROM
句は、SELECT ステートメントで使用できるテーブル、ビュー、サブクエリ、テーブル関数を指定します。これらのテーブル参照はすべて BigQuery でサポートされています。
次の表に細かな違いの一覧を示します。
Snowflake | BigQuery | |
---|---|---|
|
WITH table1 AS |
|
|
|
|
|
注: BigQuery には、ステートメント ID を使用する Snowflake の BEFORE に対応する直接的な代替手段がありません。timestamp の値は、現在のタイムスタンプよりも 7 日以上前の値にすることができません。 |
|
|
BigQuery は、ステージされたファイルの概念をサポートしていません。 |
|
|
BigQuery には、Snowflake の |
BigQuery のテーブルは、FROM
句で以下を使用することによって参照できます。
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
BigQuery はその他のテーブル参照もサポートしています。
FOR SYSTEM_TIME AS OF
を使用したテーブル定義と行の履歴バージョン- フィールドパス。つまり、あるデータ型(
STRUCT
)の内部にあるフィールドに解決される任意のパス - フラット化された配列
WHERE
句
次の場合を除き、Snowflake の WHERE
句と BigQuery の WHERE
句は同じです。
Snowflake | BigQuery | |
---|---|---|
|
SELECT col1, col2 注: BigQuery は JOIN に対する (+) 構文をサポートしていません |
JOIN
型
Snowflake と BigQuery はともに、以下のタイプの JOIN をサポートしています。
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
同等の暗黙の「カンマクロス結合」があります
Snowflake と BigQuery はどちらも ON
句と USING
句をサポートしています。
次の表に細かな違いの一覧を示します。
Snowflake | BigQuery | |
---|---|---|
|
注: BigQuery では、CROSS JOIN の場合、または結合されるテーブルの 1 つが 1 つのデータ型または配列内のフィールドである場合を除いて、 JOIN 句には JOIN 条件が必要です。 |
|
注: 非ラテラル結合の出力とは異なり、ラテラル結合の出力には、インライン ビューから生成された行のみが含まれます。左側の行は、インライン ビューに渡されていることによってすでに考慮されているため、右側の行に結合する必要はありません。 |
LATERAL JOIN の直接的な代替機能はサポートされていません。 |
WITH
句
BigQuery の WITH
句には 1 つまたは複数の名前付きサブクエリが含まれます。このサブクエリは、その後の SELECT
ステートメントから参照されるたびに実行されます。Snowflake の WITH
句は、BigQuery と同じように動作しますが、BigQuery では WITH RECURSIVE
がサポートされていません。
GROUP BY
句
Snowflake の GROUP BY
句は GROUP
BY
、GROUP BY
ROLLUP
、GROUP BY GROUPING
SETS
、GROUP BY
CUBE
をサポートし、BigQuery の GROUP BY
句は GROUP
BY
および GROUP BY
ROLLUP
をサポートします。
Snowflake の HAVING
と BigQuery の HAVING
は同じです。HAVING
は GROUP BY
と集計の後、ORDER BY
の前に置かれることに注意してください。
Snowflake | BigQuery | |
---|---|---|
|
|
|
|
|
|
注: Snowflake では、同じクエリブロックで最大 128 個のグループ化セットを使用できます |
BigQuery では、Snowflake の GROUP BY GROUPING SETS に対応する直接的な代替手段がサポートされていません。 |
|
注: Snowflake では、各キューブに最大 7 個の要素(128 個のグループ化セット)を含めることができます。 |
BigQuery では、Snowflake の GROUP BY CUBE に対応する直接的な代替手段がサポートされていません。 |
ORDER BY
句
Snowflake の ORDER BY
句と BigQuery の ORDER BY
句にはいくつかの細かな違いがあります。
Snowflake | BigQuery | |
---|---|---|
Snowflake では、NULL はデフォルト(昇順)で最も優先順位が低くなります。 |
BigQuery では、NULLS はデフォルト(昇順)で最も優先順位が高くなります |
|
NULLS FIRST と NULLS LAST を使用して、NULL 値を先頭にするか最後にするかを指定できます。 |
BigQuery には、NULL を先頭にするか最後にするかを指定する同等の機能はありません。 |
LIMIT/FETCH
句
Snowflake の LIMIT/FETCH
句は、ステートメントまたはサブクエリによって返される最大行数を制限します。LIMIT
(Postgres 構文)と FETCH
(ANSI 構文)は同じ結果を生成します。
Snowflake と BigQuery では、クエリに LIMIT
句を適用しても、読み取られるデータの量には影響しません。
Snowflake | BigQuery | |
---|---|---|
注: NULL 、空の文字列('')、 $$$$ の値が受け入れられ、「無制限」として扱われます。主な用途はコネクタとドライバです。 |
注: BigQuery では FETCH はサポートされません。FETCH に代わり LIMIT になります。注: BigQuery では、 OFFSET は LIMIT count と組み合わせて使用する必要があります。パフォーマンスを最大にするために、必ず count は必要最小限の順序付きの行の数を示す INT64 値に設定します。結果のすべての行を並べ替えると、不必要に実行のパフォーマンスが低下することになります。 |
QUALIFY
句
Snowflake の QUALIFY
句を使用すると、集計関数や GROUP BY
句で HAVING
を使用する場合と同様に、ウィンドウ関数の結果をフィルタリングできます。
Snowflake | BigQuery | |
---|---|---|
|
Snowflake での ROW_NUMBER() 、COUNT() などの分析関数と OVER PARTITION BY を含む QUALIFY 句は、BigQuery では分析値を含むサブクエリの WHERE 句として表現されます。ROW_NUMBER() を使用する場合:SELECT col1, col2
より大きなパーティションをサポートする ARRAY_AGG() を使用する場合:
|
関数
以下のセクションでは、Snowflake の関数と BigQuery でこれらに対応する関数を示します。
集計関数
次の表に、Snowflake の一般的な集計関数、集計分析関数、近似集計関数と BigQuery でこれらに対応する関数を示します。
Snowflake | BigQuery |
---|---|
注: DISTINCT には効果はありません。 |
|
注: DISTINCT には効果はありません。 |
注: BigQuery ではウィンドウ関数での APPROX_COUNT_DISTINCT はサポートされていません。 |
注: Snowflake には RESPECT NULLS オプションはありません。 |
注: BigQuery ではウィンドウ関数での APPROX_QUANTILES はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
注: 数値パラメータが指定されていない場合、デフォルトは 1 です。カウンタは数値よりも大幅に大きくする必要があります。 |
注: BigQuery ではウィンドウ関数での APPROX_TOP_COUNT はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
|
BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。 |
|
カスタム UDF を使用して、 k の個別のハッシュ関数で MINHASH を実装できます。MINHASH のバリアンスを削減するもう 1 つの方法は1 つのハッシュ関数の最小値を k にすることです。この場合、Jaccard インデックスは次のように近似できます。
|
|
APPROXIMATE_JACCARD_INDEX と同義であり、同じ方法で実装できます。 |
|
|
|
注: BigQuery の AVG では STRING の自動キャストは実行されません。 |
|
INTEGER に暗黙的にキャストされません。 |
|
注: BigQuery では、文字やテキスト列は最も近い INTEGER に暗黙的にキャストされません。 |
|
注: BigQuery では、文字やテキスト列は最も近い INTEGER に暗黙的にキャストされません。 |
注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
|
注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
|
注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
数値式の場合:
OVER を使用するには、次のコマンドを実行します(ブール値の例)。
|
|
|
|
|
|
|
|
|
|
BigQuery では、Snowflake の GROUPING に対応する直接的な代替手段がサポートされていません。ユーザー定義関数を通じて使用できます。 |
|
BigQuery では、Snowflake の GROUPING_ID に対応する直接的な代替手段がサポートされていません。ユーザー定義関数を通じて使用できます。 |
|
SELECT BIT_XOR( FARM_FINGERPRINT( TO_JSON_STRING(t))) [OVER] FROM t |
注: Snowflake では精度を指定できません。 |
注: BigQuery では、ウィンドウ関数での HLL_COUNT… はサポートされていません。1 つの HLL_COUNT... 関数に複数の式を含めることはできません。 |
注: Snowflake では精度を指定できません。 |
HLL_COUNT.INIT (expression [, precision]) |
|
HLL_COUNT.MERGE_PARTIAL (sketch) |
|
|
|
BigQuery では、Snowflake の HLL_EXPORT に対応する直接的な代替手段がサポートされていません。 |
|
BigQuery では、Snowflake の HLL_IMPORT に対応する直接的な代替手段がサポートされていません。 |
|
BigQuery では、Snowflake の KURTOSIS に対応する直接的な代替手段がサポートされていません。 |
|
|
注: Snowflake では、 ARRAY_AGG. で直接 IGNORE|RESPECT NULLS および LIMIT を指定できる機能はサポートされていません。 |
|
|
|
|
カスタム UDF を使用して、k の個別のハッシュ関数で MINHASH を実装できます。MINHASH のバリアンスを削減するもう一つの方法は、1 つのハッシュ関数の最小値を k にすることです。 SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS MINHASH
|
|
<code<select FROM ( SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS h FROM TA AS t ORDER BY h LIMIT k UNION SELECT DISTINCT FARM_FINGERPRINT( TO_JSON_STRING(t)) AS h FROM TB AS t ORDER BY h LIMIT k ) ORDER BY h LIMIT k |
|
|
|
TO_JSON_STRING を使用して値を JSON 形式の文字列に変換することもできます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BigQuery では、Snowflake の SKEW に対応する直接的な代替手段がサポートされていません。 |
|
|
|
|
|
|
|
|
注: Snowflake では、 VARCHAR を浮動小数点値にキャストする機能がサポートされています。 |
|
注: Snowflake では、 VARCHAR を浮動小数点値にキャストする機能がサポートされています。 |
|
注: Snowflake では、 VARCHAR を浮動小数点値にキャストする機能がサポートされています。 |
|
注: Snowflake では、 VARCHAR を浮動小数点値にキャストする機能がサポートされています。 |
|
BigQuery には次の集計関数、集計分析関数、近似集計関数もありますが、Snowflake にはこれらに直接対応するものはありません。
ビット単位の式関数
次の表に、Snowflake の一般的なビット単位の式関数と BigQuery でこれらに対応する関数を示します。
式のデータ型が INTEGER
でない場合、Snowflake は INTEGER
へのキャストを試みます。ただし、BigQuery は INTEGER
へのキャストを試みません。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
|
|
|
BITSHIFTRIGHT
|
|
注: Snowflake では DISTINCT. はサポートされていません。 |
|
条件式関数
次の表に、Snowflake の一般的な条件式関数と BigQuery でこれらに対応する関数を示します。
Snowflake | BigQuery |
---|---|
|
|
注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
|
注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
|
BOOLOR 注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
|
BOOLXOR 注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。 |
BigQuery では、Snowflake の BOOLXOR. に対応する直接的な代替手段がサポートされていません |
|
|
注: Snowflake では少なくとも 2 つの式が必要です。BigQuery で必要なのは 1 つのみです。 |
|
|
DECODE を再現できます。NULL 選択式と NULL 検索式を一致させるために、= NULL ではなく IS NULL を使用する必要があります。 |
|
BigQuery では、Snowflake の EQUAL_NULL. に対応する直接的な代替手段がサポートされていません |
|
|
|
|
|
|
|
|
|
BigQuery では、Snowflake の IS [ NOT ] DISTINCT FROM. に対応する直接的な代替手段がサポートされていません |
|
|
|
BigQuery では VARIANT データ型はサポートされていません。 |
|
|
|
|
|
|
|
|
|
REGR... 関数に対応する直接的な代替手段がサポートされていません。 |
|
注: BigQuery では Snowflake の REGR... 関数に対応する直接的な代替手段がサポートされていません。 |
|
|
コンテキスト関数
次の表に、Snowflake の一般的なコンテキスト関数と BigQuery でこれらに対応する関数を示します。
Snowflake | BigQuery |
---|---|
注: 直接的な比較ではありません。Snowflake はアカウント ID を返し、BigQuery はユーザーのメールアドレスを返します。 |
|
BigQuery で使用されていないコンセプト |
|
プロジェクト名のテーブルが返されます。直接的な比較ではありません。 |
|
注: Snowflake は、ANSI 標準に準拠するために、 CURRENT_DATE コマンドの後に「()」を適用しません。 |
注: BigQuery の CURRENT_DATE では、オプションのタイムゾーン指定がサポートされています。 |
注: BigQuery の INFORMATION_SCHEMA.SCHEMATA は、Snowflake の CURRENT_REGION() よりも一般化されたロケーション参照を返します。直接的な比較ではありません。 |
|
BigQuery で使用されていないコンセプト |
|
プロジェクトまたはリージョンで使用可能なすべてのデータセット(スキーマ)のテーブルが返されます。直接的な比較ではありません。 |
|
BigQuery で使用されていないコンセプト |
|
BigQuery で使用されていないコンセプト |
|
注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでクエリを検索できます。 |
|
注: Snowflake では、オプションで秒の小数部の精度を指定できます。有効な値の範囲は 0~9 ナノ秒です。デフォルト値は 9 です。ANSI に準拠するために、これは「()」なしで呼び出すことができます。 |
|
注: Snowflake では、オプションで秒の小数部の精度を指定できます。有効な値の範囲は 0~9 ナノ秒です。デフォルト値は 9 です。ANSI に準拠するために、これは「()」なしで呼び出すことができます。セッション パラメータとして TIMEZONE を設定します。 |
注:
CURRENT_DATETIME は DATETIME データ型を返します(Snowflake ではサポートされていません)。CURRENT_TIMESTAMP は TIMESTAMP データ型を返します。 |
INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。 |
|
注: Snowflake は、ANSI 標準に準拠するために、 CURRENT_USER コマンドの後に「()」を適用しません。 |
|
BigQuery で使用されていないコンセプト |
|
|
|
|
注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。 |
注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。 |
|
注: Snowflake は、ANSI 標準に準拠するために、 LOCALTIME コマンドの後に「()」を適用しません。 |
|
注:
CURRENT_DATETIME は DATETIME データ型を返します(Snowflake ではサポートされていません)。CURRENT_TIMESTAMP は TIMESTAMP データ型を返します。 |
変換関数
次の表に、Snowflake の一般的な変換関数と BigQuery でこれらに対応する関数を示します。
Snowflake と BigQuery で同一に見える関数でも、異なるデータ型が返される可能性があるので注意してください。
Snowflake | BigQuery |
---|---|
|
|
|
|
注: Snowflake では、 HEX 、BASE64 、UTF-8 の変換がサポートされています。Snowflake では、VARIANT データ型を使用する TO_BINARY もサポートされています。BigQuery には、VARIANT データ型に相当するものがありません。 |
注: BigQuery のデフォルトの STRING キャストでは UTF-8 エンコードが使用されます。Snowflake には、BASE32 エンコードをサポートするオプションがありません。 |
注:
|
注:
|
注: Snowflake の形式モデルはこちらで確認できます。BigQuery には、 VARIANT データ型に相当するものがありません。 |
注: BigQuery の入力式は、 FORMAT_DATE 、FORMAT_DATETIME 、FORMAT_TIME 、または FORMAT_TIMESTAMP を使用してフォーマットできます。 |
注: Snowflake では、 INTEGER 型を DATE 型に直接変換する機能がサポートされています。Snowflake の形式モデルはこちらで確認できます。BigQuery には、VARIANT データ型に相当するものがありません。 |
注: BigQuery の入力式は、 FORMAT 、FORMAT_DATETIME 、FORMAT_TIMESTAMP を使用してフォーマットできます。 |
注: Snowflake の DECIMAL 、NUMBER 、NUMERIC データ型の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。 |
注: BigQuery の入力式は、 FORMAT. を使用してフォーマットできます。 |
注: Snowflake の DOUBLE データ型の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。 |
注: BigQuery の入力式は、 FORMAT. を使用してフォーマットできます。 |
|
BigQuery には、Snowflake の VARIANT データ型に相当するものがありません。 |
|
BigQuery には、Snowflake の VARIANT データ型に相当するものがありません。 |
注: Snowflake の STRING データ型の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。 |
注: BigQuery には、Snowflake の VARIANT データ型に相当するものがありません。BigQuery の入力式は、FORMAT 、FORMAT_DATETIME 、FORMAT_TIMESTAMP 、FORMAT_TIME を使用してフォーマットできます。 |
注: BigQuery には、 VARIANT データ型に相当するものがありません。 |
注: BigQuery の入力式は、 FORMAT 、FORMAT_DATE 、FORMAT_DATETIME 、FORMAT_TIME を使用してフォーマットできます。タイムゾーンは、FORMAT_TIMESTAMP パラメータを使用して含めることも、含めないこともできます。 |
|
BigQuery には、Snowflake の VARIANT データ型に相当するものがありません。 |
|
BigQuery には、Snowflake の VARIANT データ型に相当するものがありません。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BigQuery には次の変換関数もありますが、Snowflake にはこれらに直接対応するものはありません。
CODE_POINTS_TO_BYTES
CODE_POINTS_TO_STRING
FORMAT
FROM_BASE32
FROM_BASE64
FROM_HEX
SAFE_CONVERT_BYTES_TO_STRING
TO_BASE32
TO_CODE_POINTS
データ生成関数
次の表に、Snowflake の一般的なデータ生成関数と BigQuery でこれらに対応する関数を示します。
Snowflake | BigQuery |
---|---|
|
BigQuery では、Snowflake の NORMAL. に対応する直接的な比較がサポートされていません |
|
注: BigQuery ではシードはサポートされていません。 |
|
BigQuery では、Snowflake の RANDSTR. に対応する直接的な比較がサポートされていません |
SEQ1 / SEQ2 / SEQ4 / SEQ8 |
BigQuery では、Snowflake の SEQ_. に対応する直接的な比較がサポートされていません |
|
注: 永続的な UDF を使用して、Snowflake の UNIFORM に相当する関数を作成します。詳しくはこちらの例をご覧ください。 |
UUID_STRING([uuid, name]) 注: Snowflake は 128 個のランダムなビットを返します。Snowflake は、バージョン 4(ランダム)とバージョン 5(名前付き)の両方の UUID をサポートしています。 |
注: BigQuery は 122 個のランダムなビットを返します。BigQuery はバージョン 4 の UUID のみをサポートします。 |
|
BigQuery では、Snowflake の ZIPF. に対応する直接的な代替手段がサポートされていません |
日付と時刻の関数
次の表に、Snowflake の一般的な日付と時刻の関数と BigQuery でこれらに対応する関数を示します。BigQuery の日付と時刻の関数としては、日付関数、日時関数、時刻関数、タイムスタンプ関数があります。
Snowflake | BigQuery |
---|---|
|
|
|
注: BigQuery では、source_timezone は常に UTC です。 |
注: Snowflake では、オーバーフローと負の日付がサポートされています。たとえば、 DATE_FROM_PARTS(2000, 1 + 24, 1) は 2002 年 1 月 1 日を返します。これは BigQuery ではサポートされていません。 |
|
注: Snowflake では ISO 曜日、ナノ秒、エポック秒/ミリ秒/マイクロ秒/ナノ秒の部分タイプがサポートされています。BigQuery ではサポートされていません。Snowflake の部分タイプの一覧については、こちら をご覧ください。. |
注: BigQuery ではサポートされている部分タイプは、週(<weekday>)、マイクロ秒、ミリ秒の部分タイプがサポートされています。Snowflake ではサポートされていません。BigQuery の部分タイプの一覧については、こちらとこちらをご覧ください。 |
注: Snowflake ではナノ秒の部分タイプがサポートされています。BigQuery ではサポートされていません。Snowflake の部分タイプの一覧については、こちら をご覧ください。. |
注: BigQuery では、週(<weekday>)、ISO 週、ISO の年の各部分タイプがサポートされています。Snowflake ではサポートされていません。 |
|
|
注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。 |
注: BigQuery では、週(<weekday>)と ISO 年の部分タイプがサポートされています。 |
|
|
注: Snowflake では ISO 曜日、ナノ秒、エポック秒/ミリ秒/マイクロ秒/ナノ秒の部分タイプがサポートされています。BigQuery ではサポートされていません。Snowflake の部分タイプの一覧については、こちら をご覧ください。. |
注: BigQuery ではサポートされている部分タイプは、週(<weekday>)、マイクロ秒、ミリ秒の部分タイプがサポートされています。Snowflake ではサポートされていません。BigQuery の部分タイプの一覧については、こちらとこちらをご覧ください。 |
|
|
|
|
|
|
|
注: dowString の再フォーマットが必要となることがあります。たとえば、Snowflake の「su」は BigQuery では「SUNDAY」になります。 |
|
注: dowString の再フォーマットが必要となることがあります。たとえば、Snowflake の「su」は BigQuery では「SUNDAY」になります。 |
注: Snowflake ではオーバーフロー時間がサポートされています。たとえば、 TIME_FROM_PARTS(0, 100, 0) は 01:40:00... を返します。これは BigQuery ではサポートされていません。BigQuery ではナノ秒はサポートされていません。 |
|
|
注: BigQuery では、Snowflake の TIME_SLICE に直接、正確に対応する関数はありません。適切なデータ型に対して DATETINE_TRUNC 、TIME_TRUNC 、TIMESTAMP_TRUNC を使用します。 |
|
|
注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。 |
注: BigQuery では、週(<weekday>)と ISO 年の部分タイプがサポートされています。 |
|
注: BigQuery ではタイムスタンプを STRING 型として入力する必要があります。例: "2008-12-25 15:30:00" |
|
|
注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。 |
注: BigQuery では、週(<weekday>)と ISO 年の部分タイプがサポートされています。 |
注: Snowflake ではナノ秒の部分タイプがサポートされています。BigQuery ではサポートされていません。Snowflake の部分タイプの一覧については、こちら をご覧ください。. |
注: BigQuery では、週(<weekday>)、ISO 週、ISO の年の各部分タイプがサポートされています。Snowflake ではサポートされていません。 |
|
|
BigQuery では、次の日付と時刻関数もサポートされています。Snowflake にはこれらに直接対応するものはありません。
情報スキーマとテーブル関数
BigQuery では、Snowflake の情報スキーマとテーブル関数の多くの概念がサポートされていません。Snowflake には次の情報スキーマとテーブル関数がありますが、BigQuery にはこれらに直接対応するものはありません。
AUTOMATIC_CLUSTERING_HISTORY
COPY_HISTORY
DATA_TRANSFER_HISTORY
DATABASE_REFRESH_HISTORY
DATABASE_REFRESH_PROGRESS, DATABASE_REFRESH_PROGRESS_BY_JOB
DATABASE_STORAGE_USAGE_HISTORY
EXTERNAL_TABLE_FILES
EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY
LOGIN_HISTORY
、LOGIN_HISTORY_BY_USER
MATERIALIZED_VIEW_REFRESH_HISTORY
PIPE_USAGE_HISTORY
REPLICATION_USAGE_HISTORY
STAGE_STORAGE_USAGE_HISTORY
TASK_DEPENDENTS
VALIDATE_PIPE_LOAD
WAREHOUSE_LOAD_HISTORY
WAREHOUSE_METERING_HISTORY
以下に、関連する BigQuery と Snowflake の情報スキーマとテーブル関数の一覧を示します。
Snowflake | BigQuery |
---|---|
QUERY_HISTORY QUERY_HISTORY_BY_* |
INFORMATION_SCHEMA.JOBS_BY_* 注: 直接的な代替手段ではありません。 |
TASK_HISTORY |
INFORMATION_SCHEMA.JOBS_BY_* 注: 直接的な代替手段ではありません。 |
BigQuery には次の情報スキーマとテーブル関数がありますが、Snowflake にはこれらに直接対応するものはありません。
INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.ROUTINES
INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.VIEWS
数値関数
次の表に、Snowflake の一般的な数値関数と BigQuery でこれらに対応する関数を示します。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注: BigQuery の CEIL では、精度やスケールを指定する機能はサポートされていません。 ROUND では切り上げを指定できません。 |
|
|
|
|
|
|
|
|
|
|
|
BigQuery には、Snowflake の FACTORIAL に対応する直接的な代替手段はありません。ユーザー定義関数を使用します。 |
|
注: BigQuery の FLOOR では、精度やスケールを指定する機能はサポートされていません。 ROUND では切り上げを指定できません。TRUNC は絶対値を評価するため、正の数に対しては同義的に実行されますが、負の数に対しては同義的に実行されません。 |
|
注: 完全一致ではありませんが、十分に類似しています。 |
|
|
|
注: LOG のデフォルトのベースは 10 です。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注: BigQuery の戻り値は、式よりも小さくする必要があります。同じ値はサポートされません。 |
BigQuery には次の数学関数もありますが、Snowflake にはこれらに直接対応するものはありません。
IS_INF
IS_NAN
IEEE_DIVIDE
DIV
SAFE_DIVIDE
SAFE_MULTIPLY
SAFE_NEGATE
SAFE_ADD
SAFE_SUBTRACT
RANGE_BUCKET
半構造化データ関数
文字列とバイナリ関数
Snowflake | BigQuery |
---|---|
|
|
ASCII |
|
BASE64_DECODE_BINARY |
|
BASE64_DECODE_STRING |
|
BASE64_ENCODE |
|
BIT_LENGTH |
CHARACTER_LENGTH |
|
|
CHR,CHAR |
|
COLLATE |
カスタムのユーザー定義関数 |
COLLATION |
カスタムのユーザー定義関数 |
COMPRESS |
カスタムのユーザー定義関数 |
|
CONCAT (...) では、任意の数の文字列を連結できます。 |
CONTAINS |
カスタムのユーザー定義関数 |
DECOMPRESS_BINARY |
カスタムのユーザー定義関数 |
DECOMPRESS_STRING |
カスタムのユーザー定義関数 |
EDITDISTANCE |
カスタムのユーザー定義関数 |
ENDSWITH |
カスタムのユーザー定義関数 |
HEX_DECODE_BINARY |
|
HEX_DECODE_STRING |
|
HEX_ENCODE |
|
ILIKE |
カスタムのユーザー定義関数 |
ILIKE ANY |
カスタムのユーザー定義関数 |
INITCAP |
INITCAP |
INSERT |
カスタムのユーザー定義関数 |
LEFT |
ユーザー定義関数 |
LENGTH |
|
LIKE |
LIKE |
LIKE ALL |
カスタムのユーザー定義関数 |
LIKE ANY |
カスタムのユーザー定義関数 |
LOWER |
|
LPAD |
|
LTRIM |
|
|
|
MD5_BINARY |
カスタムのユーザー定義関数 |
OCTET_LENGTH |
カスタムのユーザー定義関数 |
PARSE_IP |
カスタムのユーザー定義関数 |
PARSE_URL |
カスタムのユーザー定義関数 |
POSITION |
|
REPEAT |
|
REPLACE |
|
REVERSE
|
|
RIGHT |
ユーザー定義関数 |
RPAD |
RPAD |
RTRIM |
|
RTRIMMED_LENGTH |
カスタムのユーザー定義関数 |
SHA1,SHA1_HEX |
|
SHA1_BINARY |
カスタムのユーザー定義関数 |
SHA2,SHA2_HEX |
カスタムのユーザー定義関数 |
SHA2_BINARY |
カスタムのユーザー定義関数 |
SOUNDEX |
カスタムのユーザー定義関数 |
SPACE |
カスタムのユーザー定義関数 |
SPLIT |
SPLIT |
SPLIT_PART |
カスタムのユーザー定義関数 |
SPLIT_TO_TABLE |
カスタムのユーザー定義関数 |
STARTSWITH |
カスタムのユーザー定義関数 |
STRTOK |
注: delimiter 文字列引数全体が単一の区切り文字として使用されます。デフォルトの区切り文字はカンマです。 |
STRTOK_SPLIT_TO_TABLE |
カスタムのユーザー定義関数 |
SUBSTR,SUBSTRING |
SUBSTR |
TRANSLATE |
カスタムのユーザー定義関数 |
TRIM |
TRIM |
TRY_BASE64_DECODE_BINARY |
カスタムのユーザー定義関数 |
TRY_BASE64_DECODE_STRING |
|
TRY_HEX_DECODE_BINARY |
|
TRY_HEX_DECODE_STRING |
|
UNICODE |
カスタムのユーザー定義関数 |
|
UPPER |
文字列関数(正規表現)
Snowflake | BigQuery |
---|---|
REGEXP |
|
REGEXP_COUNT |
position が指定されている場合:
注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。 |
REGEXP_INSTR |
position が指定されている場合:
occurrence が指定されている場合:
注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。 |
|
|
REGEXP_REPLACE |
replace_string が指定されている場合:
position が指定されている場合:
注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。 |
REGEXP_SUBSTR |
position が指定されている場合:
occurrence が指定されている場合:
注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。 |
RLIKE |
|
システム関数
テーブル関数
Snowflake | BigQuery | |
---|---|---|
GENERATOR |
カスタムのユーザー定義関数 | |
GET_OBJECT_REFERENCES |
カスタムのユーザー定義関数 | |
RESULT_SCAN |
カスタムのユーザー定義関数 | |
VALIDATE |
カスタムのユーザー定義関数 |
ユーティリティとハッシュ関数
Snowflake | BigQuery | |
---|---|---|
GET_DDL |
機能リクエスト | |
HASH |
HASH は、Snowflake 固有の専用関数です。Snowflake で使用される基礎となるロジックが不明なために変換できません。 |
ウィンドウ関数
Snowflake | BigQuery | |
---|---|---|
CONDITIONAL_CHANGE_EVENT |
カスタムのユーザー定義関数 | |
CONDITIONAL_TRUE_EVENT |
カスタムのユーザー定義関数 | |
CUME_DIST |
CUME_DIST |
|
DENSE_RANK |
DENSE_RANK |
|
FIRST_VALUE |
FIRST_VALUE |
|
LAG |
LAG |
|
LAST_VALUE |
LAST_VALUE |
|
LEAD |
LEAD |
|
NTH_VALUE |
NTH_VALUE |
|
NTILE |
NTILE |
|
PERCENT_RANK |
PERCENT_RANK |
|
RANK |
RANK |
|
RATIO_TO_REPORT |
カスタムのユーザー定義関数 | |
ROW_NUMBER |
ROW_NUMBER |
|
WIDTH_BUCKET |
カスタムのユーザー定義関数 |
BigQuery では、SAFE_CAST
(expression AS typename) もサポートされます。これは、BigQuery がキャストを実行できない場合に NULL を返します(たとえば、SAFE_CAST
("apple" AS INT64) は NULL を返します)。
演算子
以下のセクションでは、Snowflake 演算子と BigQuery でこれらに対応するものを示します。
算術演算子
次の表に、Snowflake の算術演算子と BigQuery でこれらに対応するものを示します。
Snowflake | BigQuery |
---|---|
|
|
|
|
|
注: BigQuery は標準の単項マイナスをサポートしますが、文字列形式の整数を INT64 型、NUMERIC 型、または FLOAT64 型に変換しません。 |
|
|
|
|
|
|
|
|
|
|
算術演算実行時の Snowflake のスケールと精度の詳細を確認するには、Snowflake のドキュメントをご覧ください。
比較演算子
Snowflake の比較演算子と BigQuery の比較演算子は同じです。
論理演算子/ブール演算子
Snowflake の論理演算子/ブール演算子と BigQuery の論理演算子/ブール演算子は同じです。
集合演算子
次の表に、Snowflake の集合演算子と BigQuery でこれらに対応するものを示します。
Snowflake | BigQuery |
---|---|
|
INTERSECT DISTINCT
|
注: MINUS と EXCEPT は同義です。 |
|
|
|
サブクエリ演算子
次の表に、Snowflake の集合演算子と BigQuery でこれらに対応する演算子を示します。
Snowflake | BigQuery |
---|---|
|
BigQuery では、Snowflake の「ALL/ANY」に対応する直接的な代替手段がサポートされていません。 |
|
|
|
|
|
注: BigQuery では、異なる set 演算子を区別するためにかっこが必要です。同じ set 演算子を繰り返すときは、かっこは不要です。 |
DML 構文
このセクションでは、Snowflake と BigQuery のデータ管理言語の構文の違いについて説明します。
INSERT
ステートメント
Snowflake では、列に対して構成可能な DEFAULT
キーワードがあります。BigQuery では、NULL が許容される列の DEFAULT
値は NULL であり、必須の列では DEFAULT
がサポートされません。Snowflake の INSERT
ステートメントのほとんどは、BigQuery と互換性があります。次の表に例外を示します。
Snowflake | BigQuery |
---|---|
注: BigQuery では、 INSERT ステートメントを使用して JSON オブジェクトを挿入することはできません。. |
VALUES (DEFAULT [, ...]) 注: BigQuery では Snowflake の OVERWRITE に対応する直接的な代替手段がサポートされていません。代わりに DELETE を使用してください。 |
|
|
... 注:
<intoClause> は、上記の標準の INSERT statement を表します。 |
BigQuery では、条件付きおよび無条件の複数テーブルの INSERTs はサポートされていません。 |
BigQuery ではサブクエリを使用した値の挿入(値の 1 つがサブクエリを使用して計算される)もサポートされますが、Snowflake ではサポートされません。例を次に示します。
INSERT INTO table (column1, column2)
VALUES ('value_1', (
SELECT column2
FROM table2
))
COPY
ステートメント
Snowflake は、ステージ ファイルから既存のテーブルへのデータのコピー、テーブルから名前付き内部ステージ、名前付き外部ステージ、外部ロケーション(Amazon S3、Google Cloud Storage、または Microsoft Azure)へのデータのコピーをサポートします。
BigQuery では、データの読み込みに SQL COPY
コマンドは使用されませんが、SQL 以外のツールおよびオプションをいくつか自由に使用して、データを BigQuery テーブルに読み込むことができます。また、Apache Spark または Apache Beam で提供されるデータ パイプライン シンクを使用して BigQuery にデータを書き込むこともできます。
UPDATE
ステートメント
Snowflake の UPDATE
ステートメントのほとんどは、BigQuery と互換性があります。次の表に例外を示します。
Snowflake | BigQuery | |
---|---|---|
|
注: BigQuery のすべての UPDATE ステートメントには、WHERE キーワードと、その後に続く条件が必要です。 |
DELETE
および TRUNCATE TABLE
ステートメント
DELETE
ステートメントと TRUNCATE TABLE
ステートメントはいずれも、テーブルのスキーマやインデックスに影響を与えることなくテーブルから行を削除できます。
Snowflake では、DELETE
と TRUNCATE TABLE
の両方が、復元の目的で、Snowflake のタイムトラベルを使用して削除されたデータをデータ保持期間にわたって維持します。ただし、DELETE を使用しても、外部ファイルの読み込み履歴と読み込みメタデータは削除されません。
BigQuery では、DELETE
ステートメントには WHERE
句が必要です。BigQuery の DELETE
の詳細については、DML ドキュメントの BigQuery DELETE
の例をご覧ください。
Snowflake | BigQuery |
---|---|
|
注: BigQuery DELETE ステートメントには WHERE 句が必要です。 |
MERGE
ステートメント
MERGE
ステートメントでは、INSERT
、UPDATE
、DELETE
オペレーションを 1 つの「upsert」ステートメントに組み合わせて、自動的に実行できます。MERGE
オペレーションでは、ターゲット行ごとに最大で 1 つのソース行を対応させる必要があります。
BigQuery のテーブルでは、DML ステートメントの数が 1 日あたり 1,000 件に制限されているため、次の表に示されるように INSERT、UPDATE、DELETE ステートメントを 1 つの MERGE ステートメントに統合して最適化する必要があります。
Snowflake | BigQuery |
---|---|
注: Snowflake では、非確定的な結果を処理するために ERROR_ON_NONDETERMINISTIC_MERGE セッション パラメータがサポートされています。 |
注: すべての列を更新するには、すべての列をリストする必要があります。 |
GET
および LIST
ステートメント
GET
ステートメントは、次のいずれかの Snowflake ステージからクライアント マシンのローカル ディレクトリ / フォルダにデータファイルをダウンロードします。
- 名前付き内部ステージ
- 指定されたテーブルの内部ステージ
- 現在のユーザーの内部ステージ
LIST
(LS)ステートメントは、次のいずれかの Snowflake のステージからステージングされた(つまり、ローカル ファイル システムからアップロードされるか、テーブルからアンロードされた)ファイルのリストを返します。
- 名前付き内部ステージ
- 名前付き外部ステージ
- 指定されたテーブルのステージ
- 現在のユーザーのステージ
BigQuery はステージングのコンセプトをサポートしておらず、GET
と LIST
に対応するステートメントがありません。
PUT
および REMOVE
ステートメント
PUT
ステートメントは、クライアント マシンのローカル ディレクトリまたはフォルダから、次のいずれかの Snowflake ステージにデータファイルをアップロード(つまり、ステージング)します。
- 名前付き内部ステージ
- 指定されたテーブルの内部ステージ
- 現在のユーザーの内部ステージ
REMOVE
(RM)
ステートメントは、次のいずれかの Snowflake 内部ステージでステージングされたファイルを削除します。
- 名前付き内部ステージ
- 指定されたテーブルのステージ
- 現在のユーザーのステージ
BigQuery はステージングのコンセプトをサポートしておらず、PUT
と REMOVE
に対応するステートメントがありません。
DDL 構文
ここでは、Snowflake と BigQuery のデータ定義言語の構文の違いについて説明します。
データベース、スキーマ、共有 DDL
Snowflake の用語の大部分は BigQuery の用語と同じですが、例外として Snowflake データベースは BigQuery のデータセットに似ているという点があります。Snowflake から BigQuery への詳細な用語のマッピングをご覧ください。
CREATE DATABASE
ステートメント
Snowflake ではデータベース管理コマンドを使用したデータベースの作成と管理がサポートされており、BigQuery ではデータセットの作成のためのコンソール、CLI、クライアント ライブラリの使用などの複数のオプションが用意されています。このセクションでは、これらの違いに対処するために、Snowflake のコマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
注: Snowflake では、データベースの命名に関する要件があります。名前に使用できるのは 255 文字のみです。 |
注: BigQuery には、Snowflake と似たデータセットの命名要件がありますが、名前に使用できる文字が 1,024 文字以内である点が異なります。 |
|
BigQuery ではデータセットの置換はサポートされていません。 |
|
BigQuery では一時データセットの作成はサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません |
|
BigQuery では、データセットのクローン作成はまだサポートされていません。 |
|
BigQuery では、データセット レベルでのタイムトラベルはサポートされていません。ただし、テーブルとクエリ結果のタイムトラベルはサポートされています。 |
|
BigQuery では DDL での照合はサポートされていません。 |
|
|
|
BigQuery では共有データセットの作成はサポートされていません。ただし、データセットが作成されると、ユーザーはコンソールまたは UI からデータセットを共有できます。 |
注: Snowflake には、BigQuery でサポートされていないセカンダリ データベースにマテリアライズド ビューの自動バックグラウンド メンテナンスのオプションが用意されています。 |
|
BigQuery では、次の bq mk
コマンド オプションもサポートされています。Snowflake にはこれらに直接対応するものはありません。
--location <dataset_location>
--default_table_expiration <time_in_seconds>
--default_partition_expiration <time_in_seconds>
ALTER DATABASE
ステートメント
このセクションでは、ALTER ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
|
BigQuery ではデータセットの名前変更はサポートされていませんが、データセットのコピーはサポートされています。 |
|
BigQuery では、データセットのスワップはサポートされていません。 |
|
BigQuery では、データセット レベルでのデータの保持と照合はサポートされていません。 |
|
|
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
|
BigQuery では、このコンセプトはサポートされていません。 |
DROP DATABASE
ステートメント
このセクションでは、DROP ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
注: Snowflake では、データベースを破棄してもシステムから完全に削除されることはありません。破棄されたデータベースのバージョンは、データベースに対して DATA_RETENTION_TIME_IN_DAYS パラメータで指定された日数の間保持されます。 |
-r は、データセット内のすべてのオブジェクトを削除します
-d はデータセットを示します注: BigQuery では、データセットの削除は永続的です。また、データセット内のすべてのデータとオブジェクトが削除されるため、データセット レベルでのカスケードはサポートされていません。 |
Snowflake では UNDROP DATASET
コマンドもサポートされています。このコマンドは、破棄したデータセットの最新バージョンを復元します。これは現在、BigQuery でデータセット レベルではサポートされていません。
USE DATABASE
ステートメント
Snowflake では、USE DATABASE
コマンドを使用してユーザー セッションのデータベースを設定できます。これにより、SQL コマンドで完全修飾オブジェクト名を指定する必要がなくなります。BigQuery には、Snowflake の USE DATABASE コマンドに対応するものはありません。
SHOW DATABASE
ステートメント
このセクションでは、SHOW ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
注: Snowflake では、保持期間内に破棄されたデータベースを含むすべてのデータベースの詳細を 1 つの方法で一覧表示できます。 |
bq ls --format=prettyjson/
注: BigQuery では、ls コマンドはデータセット名と基本情報のみを表示し、show コマンドは最終更新時のタイムスタンプ、ACL、データセットのラベルなどの詳細を表示します。BigQuery では、情報スキーマを使用してデータセットの詳細情報も確認できます。 |
注: Snowflake では、TERSE オプションを使用すると、データセットに関する特定の情報やフィールドのみを表示できます。 |
BigQuery では、このコンセプトはサポートされていません。 |
タイムトラベルのコンセプトは、BigQuery でデータセット レベルではサポートされていません。 | |
SHOW DATABASES
|
BigQuery では、データセット名による結果のフィルタリングはサポートされていません。ただし、ラベルによるフィルタリングはサポートされています。 |
SHOW DATABASES
注: Snowflake では、デフォルトでは結果の数に制限はありません。ただし、LIMIT の値は 10,000 以下にする必要があります。 |
注: デフォルトでは、BigQuery は 50 件の結果のみを表示します。 |
BigQuery では、次の bq
コマンド オプションもサポートされています。Snowflake にはこれらに直接対応するものはありません。
- bq ls --format=pretty: 基本的なフォーマット済みの結果が返されます
- *bq ls -a: *匿名データセット(アンダースコアで始まるデータセット)のみが返されます
- bq ls --all: 匿名のデータセットを含むすべてのデータセットが返されます
- bq ls --filter labels.key:value: データセット ラベルでフィルタした結果が返されます
- bq ls --d: 匿名データセットの結果を除外します
- bq show --format=pretty: すべてのデータセットに対する基本的なフォーマット済みの結果が返されます
SCHEMA
の管理
Snowflake には、データベース管理コマンドと同様に、複数のスキーマ管理コマンドが用意されています。BigQuery では、スキーマの作成と管理というこのコンセプトはサポートされていません。
ただし BigQuery では、データをテーブルに読み込むときと、空のテーブルを作成するときに、テーブルのスキーマを指定できます。あるいは、サポートされているデータ形式についてスキーマの自動検出を使用することもできます。
SHARE
の管理
Snowflake には、データベースとスキーマの管理コマンドに似た複数の共有管理コマンドがあります。BigQuery では、共有の作成と管理というこのコンセプトはサポートされていません。
テーブル、ビュー、シーケンス DDL
CREATE TABLE
ステートメント
Snowflake の CREATE TABLE
ステートメントのほとんどは BigQuery と互換性がありますが、例外として次の構文要素は BigQuery で使用されません。
Snowflake | BigQuery |
---|---|
注: UNIQUE 制約と PRIMARY KEY 制約は情報提供を目的としており、Snowflake システムでは適用されません。 |
|
ここで、 table_constraints は:
注:
UNIQUE 制約と PRIMARY KEY 制約は情報提供を目的としており、Snowflake システムでは適用されません。 |
注: BigQuery では、 UNIQUE 、PRIMARY KEY 、FOREIGN 、KEY の各テーブル制約は使用されません。これらの制約によって提供されるものと同様の最適化をクエリの実行時に実現するには、BigQuery テーブルをパーティション化およびクラスタ化します。CLUSTER BY は最大 4 列をサポートします。 |
|
INFORMATION_SCHEMA テーブルを使用して列名、データ型、NOT NULL 制約を新しいテーブルにコピーする方法については、この例を参照してください。 |
注: Snowflake では BACKUP NO が「スナップショットの作成時およびスナップショットからの復元時に処理時間を節約し、ストレージ容量を減らす」と指定されています。 |
BACKUP NO テーブル オプションは使用されず、必要でもありません。これは、BigQuery では処理時間にも課金対象ストレージにも影響を与えることなく、テーブルの過去バージョンが最大 7 日間、自動的に保存されるためです。 |
ここで、 table_attributes は:
|
BigQuery ではクラスタリングがサポートされており、並べ替えた順序でキーを保存できます。 |
|
|
|
|
BigQuery は CREATE OR REPLACE
TABLE
ステートメント(DDL ステートメント)もサポートされます。このステートメントでは、既存のテーブル(存在する場合)が上書きされます。
BigQuery の CREATE TABLE
ステートメントでは次の句もサポートされています。Snowflake には、これらと同等のものはありません。
BigQuery の CREATE TABLE
の詳細については、DML ドキュメントの BigQuery CREATE
の例をご覧ください。
ALTER TABLE
ステートメント
このセクションでは、テーブルに対する ALTER ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
|
|
|
BigQuery では、テーブルのスワップはサポートされていません。 |
|
BigQuery では、テーブルのデータ照合の管理はポートされていません。 |
|
|
|
|
さらに Snowflake には、BigQuery でサポートされていないテーブルを変更するためのクラスタリング、列、制約のオプションが用意されています。
DROP TABLE
および UNDROP TABLE
ステートメント
このセクションでは、DROP ステートメントと UNDROP ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
注: Snowflake では、テーブルを破棄してもシステムから完全に削除されることはありません。破棄されたテーブルのバージョンは、データベースに対して DATA_RETENTION_TIME_IN_DAYS パラメータで指定された日数の間保持されます。 |
-f は、実行の確認をスキップします -d は、データセットを指定します 注: BigQuery では、テーブルの削除も永続的ではありませんが、スナップショットは現在、7 日間のみ保持されます。 |
|
注: BigQuery では、テーブルが存在していたときの UNIX タイムスタンプ(ミリ秒単位)を最初に特定する必要があります。次に、そのタイムスタンプの時点のテーブルを新しいテーブルにコピーします。新しいテーブルの名前は、削除したテーブルとは異なる名前にする必要があります。 |
CREATE EXTERNAL TABLE
ステートメント
BigQuery では、永続テーブルと一時外部テーブルの両方を作成し、次のデータに対して直接クエリを実行できます。
Snowflake では、永続外部テーブルを作成できます。このテーブルに対してクエリを実行すると、指定された外部ステージにある 1 つ以上のファイルのセットからデータが読み取られます。
このセクションでは、CREATE EXTERNAL TABLE ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。
Snowflake | BigQuery |
---|---|
CREATE [OR REPLACE] EXTERNAL TABLE
注: Snowflake では、読み取るデータが含まれているファイルをステージングし、外部テーブルのフォーマット タイプ オプションを指定できます。Snowflake の形式タイプ(CSV、JSON、AVRO、PARQUET、ORC)は、XML タイプを除き、すべて BigQuery でサポートされています。 |
注: BigQuery では、テーブル定義ファイル [1]、JSON スキーマ ファイル [2]、インライン スキーマ定義 [3] を使用して、データソースにリンクされた永続テーブルを作成できます。BigQuery では、読み取るファイルのステージングとフォーマット タイプ オプションの指定はサポートされていません。 |
|
注: BigQuery では現在、外部テーブルの作成用に Snowflake のオプション パラメータのオプションはサポートされていません。パーティショニングの場合、BigQuery では _FILE_NAME 疑似列を使用して、外部テーブルの上にパーティション分割テーブルやビューを作成できます。詳細については、_FILE_NAME 疑似列のクエリをご覧ください。 |
さらに BigQuery では、デフォルトの Hive パーティショニング レイアウトを使用して Google Cloud Storage に保存されている AVRO、PARQUET、ORC、JSON、CSV 形式の外部でパーティションに分割されたデータのクエリもサポートされています。
CREATE VIEW
ステートメント
次の表は、Snowflake と BigQuery で CREATE VIEW
ステートメントに相当するステートメントを示しています。
Snowflake | BigQuery |
---|---|
|
|
|
CREATE OR REPLACE VIEW
|
|
|
非対応 | CREATE VIEW IF NOT EXISTS
|
|
BigQuery でビューを作成するには、参照されるすべてのオブジェクトがすでに存在している必要があります。 BigQuery を使用すると、外部データソースに対してクエリを実行できます。 |
CREATE SEQUENCE
ステートメント
BigQuery ではシーケンスは使用されません。この機能は次のバッチ手法で実現できます。サロゲートキーと変化が緩やかなディメンション(SCD)について詳しくは、次のガイドをご覧ください。
|
---|
データ読み込みと DDL のアンロード
Snowflake では、ステージ、ファイル形式、パイプ管理コマンドによるデータの読み込みとアンロードがサポートされています。BigQuery には、bq load、BigQuery Data Transfer Service、bq extract などの複数のオプションも用意されています。このセクションでは、データの読み込みとアンロードでのこれらの方法の使用の違いについて説明します。
アカウントとセッションの DDL
Snowflake のアカウントとセッションのコンセプトは、BigQuery ではサポートされていません。BigQuery では、Cloud IAM を使用してすべてのレベルでアカウントを管理できます。BigQuery では、マルチステートメント トランザクションはまだサポートされていません。
ユーザー定義関数(UDF)
UDF を使用すると、カスタム操作用の関数を作成できます。これらの関数は入力列を受け取ってアクションを実行し、その結果を値として返します。
Snowflake と BigQuery はどちらも、SQL 式と JavaScript コードを使用した UDF をサポートしています。
一般的な BigQuery UDF のライブラリについては、GitHub リポジトリ GoogleCloudPlatform/bigquery-utils/ を参照してください。
CREATE FUNCTION
の構文
次の表に、Snowflake と BigQuery の SQL UDF 作成構文の違いを示します。
Snowflake | BigQuery |
---|---|
|
注: BigQuery の SQL UDF では、返されるデータ型の指定は任意です。BigQuery は、クエリが関数を呼び出すときに SQL 関数本文から関数の結果の型を推測します。 |
|
注: BigQuery の SQL UDF では現在、テーブルタイプを返すことはサポートされていませんが、プロダクト ロードマップに記載されており、まもなくご利用いただけるようになります。ただし、BigQuery は STRUCT 型の ARRAY を返すことはサポートしています。 |
注: Snowflake には、UDF の定義と詳細を承認済みユーザー(ビューを所有するロールが付与されたユーザー)のみに制限する安全なオプションがあります。 |
注: BigQuery では、関数のセキュリティは構成可能なパラメータではありません。BigQuery では、IAM のロールと権限を作成して、基礎となるデータと関数定義へのアクセスを制限できます。 |
|
注: null 入力に対する関数の動作は BigQuery で暗黙的に処理され、別のオプションとして指定する必要はありません。 |
|
注: BigQuery では、関数の変動性は構成可能なパラメータではありません。BigQuery UDF の変動性はすべて、Snowflake の IMMUTABLE の変動性と同等です(つまり、データベースのルックアップを行わず、また引数リストに直接存在しない情報を使用しません)。 |
|
CREATE [OR REPLACE] FUNCTION
注: 単一引用符やドル記号のような文字シーケンスの使用は($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression. |
|
Note:Adding comments or descriptions in UDFs is currently not supported in BigQuery. |
|
Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery. |
BigQuery also supports the CREATE FUNCTION IF NOT EXISTS
statement
which treats the query as successful and takes no action if a function with the
same name already exists.
BigQuery's CREATE FUNCTION
statement also supports creating
TEMPORARY or TEMP functions
,
which do not have a Snowflake equivalent. See
calling UDFs
for details on executing a BigQuery persistent UDF.
DROP FUNCTION
syntax
The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.
Snowflake | BigQuery |
---|---|
|
Note: BigQuery does not require using the function's signature (argument data type) for deleting the function. |
BigQuery requires that you specify the project_name if the function is not located in the current project.
Additional function commands
This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.
ALTER FUNCTION
syntax
Snowflake supports the following operations using
ALTER FUNCTION
syntax.
- Renaming a UDF
- Converting to (or reverting from) a secure UDF
- Adding, overwriting, removing a comment for a UDF
As configuring function security and adding function comments is not available in BigQuery, ALTER FUNCTION syntax is currently not supported. However, the CREATE FUNCTION statement can be used to create a UDF with the same function definition but a different name.
DESCRIBE FUNCTION
syntax
Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
SHOW USER FUNCTIONS
syntax
In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
Stored procedures
Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.
CREATE PROCEDURE
syntax
In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.
The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.
Snowflake | BigQuery |
---|---|
Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option. |
CREATE [OR REPLACE] PROCEDURE
Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed. |
|
|
|
CREATE [OR REPLACE] PROCEDURE
注: null 入力に対するプロシージャの動作は BigQuery で暗黙的に処理され、別のオプションとして指定する必要はありません。 |
CREATE [OR REPLACE] PROCEDURE
|
注: BigQuery では、プロシージャの変動性は構成可能なパラメータではありません。Snowflake の IMMUTABLE の変動性と同等です。 |
CREATE [OR REPLACE] PROCEDURE
|
注: 現時点では、BigQuery でプロシージャの定義にコメントや説明を追加することはできません。 |
CREATE [OR REPLACE] PROCEDURE
注: Snowflake では、実行するプロシージャの呼び出し元または所有者を指定できます。 |
注: BigQuery のストアド プロシージャは、常に呼び出し元として実行されます。 |
BigQuery では CREATE PROCEDURE IF NOT EXISTS
ステートメントもサポートされています。同名の関数がすでに存在する場合、このステートメントはクエリを成功として扱って何も実行しません。
DROP PROCEDURE
の構文
次の表に、Snowflake と BigQuery の DROP FUNCTION 構文の違いを示します。
Snowflake | BigQuery |
---|---|
|
注: BigQuery では、プロシージャを削除するためにプロシージャの署名(引数のデータ型)を使用する必要はありません。 |
BigQuery では、プロシージャが現在のプロジェクトに配置されていない場合、project_name を指定する必要があります。
その他のプロシージャ コマンド
Snowflake では、ALTER PROCEDURE
、DESC[RIBE] PROCEDURE
、SHOW PROCEDURES
などの追加のコマンドを使用してストアド プロシージャを管理します。現在、これらのコマンドは BigQuery ではサポートされていません。
メタデータおよびトランザクション SQL ステートメント
Snowflake | BigQuery |
---|---|
|
BigQuery では、常にスナップショット分離が使用されます。詳しくは、このドキュメントの整合性の保証をご覧ください。 |
|
BigQuery では使用されません。 |
|
BigQuery では使用されません |
|
BigQuery では使用されません。 |
マルチステートメントおよび複数行 SQL ステートメント
Snowflake と BigQuery はどちらも、トランザクション(セッション)をサポートしているため、一貫して一緒に実行されるセミコロンで区切られたステートメントをサポートしています。詳細については、マルチステートメント トランザクションをご覧ください。
ステージングされたファイルのメタデータ列
Snowflake は内部ステージおよび外部ステージにあるファイルのメタデータを自動的に生成します。このメタデータは、通常のデータ列とともにクエリを実行してテーブルに読み込むことができます。次のメタデータ列を使用できます。
整合性の保証とトランザクション分離
Snowflake と BigQuery はどちらもアトミックです。つまり、多数の行にわたってミューテーション単位で ACID に準拠しています。
トランザクション
各 Snowflake トランザクションには一意の開始時刻(ミリ秒を含む)が割り当てられ、これがトランザクション ID として設定されます。Snowflake では READ COMMITTED
分離レベルのみがサポートされています。ただし、2 つのステートメントが同じトランザクション内にある場合、一方のステートメントで行われた変更は、まだ commit されていないでも、別のステートメントで参照できます。Snowflake トランザクションは、リソースが変更されている際にリソース(テーブル)のロックを取得しますがユーザーは、ステートメントがタイムアウトするまで待機するブロックされたステートメントの最大時間を調整できます。AUTOCOMMIT
パラメータが有効になっていると、DML ステートメントが自動的に commit されます。
また、BigQuery はトランザクションをサポートしています。BigQuery では、スナップショット分離を使用して、オプティミスティック同時実行制御(最初の commit が優先)が確実に実行されるようにします。この場合、クエリは、クエリの開始前に最後に commit されたデータを読み取ります。この方法により、行ごと、ミューテーションごと、同じ DML ステートメント内の行全体で、同じレベルの整合性が保証され、デッドロックも回避されます。同じテーブルに対して複数の DML 更新を行う場合、BigQuery はペシミスティック同時実行制御に切り替わります。読み込みジョブは完全に独立して実行され、テーブルへの連結を実行できます。ただし BigQuery では、明示的なトランザクション境界もセッションもまだ提供されていません。
ロールバック
トランザクションが commit またはロールバックされる前に、Snowflake トランザクションのセッションが予期せず終了した場合、トランザクションは切断された状態のままになります。ユーザーは SYSTEM$ABORT_TRANSACTION を実行して、切断されたトランザクションを中止する必要があります。中止しない場合、切断されたトランザクションは、Snowflake によって 4 時間のアイドル状態の経過後にロールバックされます。デッドロックが発生すると、Snowflake はデッドロックを検出し、ロールバックする新しいステートメントを選択します。明示的に開いたトランザクションの DML ステートメントが失敗した場合、変更はロールバックされますが、トランザクションは commit またはロールバックされるまで開いたままになります。Snowflake の DDL ステートメントは自動 commit されるため、ロールバックできません。
BigQuery では ROLLBACK TRANSACTION
ステートメントがサポートされています。BigQuery には ABORT
ステートメントがありません。
データベースに関する上限
最新の割り当てと上限については、必ず BigQuery の公開ドキュメントを確認してください。大量のユーザーに多数の割り当てを行う場合は、Cloud サポートチームに連絡して上限を引き上げることができます。
すべての Snowflake アカウントには、デフォルトでソフトリミットが設定されています。ソフトリミットはアカウント作成時に設定され、変更される可能性があります。Snowflake の多くのソフトリミットは、Snowflake アカウント チームまたはサポート チケットを使用して引き上げることができます。
次の表に、Snowflake と BigQuery のデータベースに関する上限の比較を示します。
上限 | Snowflake | BigQuery |
---|---|---|
クエリテキストのサイズ | 1 MB | 1 MB |
同時実行クエリの最大数 | XS ウェアハウス - 8 S ウェアハウス - 16 M ウェアハウス - 32 L ウェアハウス - 64 XL ウェアハウス - 128 |
100 |