チュートリアル:Parquetデータのロードとアンロード

概要

このチュートリアルでは、 COPY INTO <テーブル> コマンドを使用してステージされたParquetファイルの要素をテーブル列に直接変換することで、Parquetデータをアップロードする方法について説明します。このチュートリアルでは、 COPY INTO <場所> コマンドを使用してテーブルデータをParquetファイルにアンロードする方法についても説明します。

前提条件

このチュートリアルのために、次を実行する必要があります。

  • Snowflakeが提供するParquetデータファイルをダウンロードする。

  • データベース、テーブル、および仮想ウェアハウスを作成する。

データベース、テーブル、および仮想ウェアハウスは、Snowflakeのほとんどのアクティビティに必要となる基本的なSnowflakeオブジェクトです。

サンプルデータファイルのダウンロード

サンプルParquetデータファイルをダウンロードするには、 cities.parquet をクリックします。または、リンクを右クリックし、リンク/ファイルをローカルファイルシステムに保存します。

このチュートリアルでは、次のディレクトリにファイルを解凍したことを前提としています。

  • Linux/macOS: /tmp/load

  • Windows: C:\tempload

Parquetデータファイルには、サンプルの大陸データが含まれています。以下は代表的な例です。

{ "continent": "Europe", "country": { "city": [ "Paris", "Nice", "Marseilles", "Cannes" ], "name": "France" } } 
Copy

データベース、テーブル、および仮想ウェアハウスの作成

次のコマンドにより、このチュートリアルで使用するためのオブジェクトを作成します。チュートリアルを完了したら、これらのオブジェクトをドロップできます。

 create or replace database mydatabase; use schema mydatabase.public; create or replace temporary table cities ( continent varchar default null, country varchar default null, city variant default null ); create or replace warehouse mywarehouse with warehouse_size='X-SMALL' auto_suspend = 120 auto_resume = true initially_suspended=true; use warehouse mywarehouse; 
Copy

これらのコマンドは、仮テーブルを作成することに注意してください。仮テーブルは、ユーザーセッションの間のみ保持され、他のユーザーには表示されません。

ファイル形式オブジェクトを作成する

CREATE FILE FORMAT コマンドを実行して、 sf_tut_parquet_format ファイル形式を作成します。

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format TYPE = parquet; 
Copy

TYPE = 'parquet' は、ソースファイル形式の種類を示します。CSV は、デフォルトのファイル形式の種類です。

ステージオブジェクトを作成する

CREATE STAGE コマンドを実行して、内部 sf_tut_stage ステージを作成します。

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage FILE_FORMAT = sf_tut_parquet_format; 
Copy

仮ステージは、仮テーブルのように、セッションの終了時に自動的にドロップされます。

データファイルをステージングする

PUT コマンドを実行して、Parquetファイルをローカルファイルシステムから名前付きステージにアップロードします。

  • Linuxまたは macOS

    PUT file:///tmp/load/cities.parquet @sf_tut_stage; 
    Copy
  • Windows

    PUT file://C:\temp\load\cities.parquet @sf_tut_stage; 
    Copy

データをターゲットテーブルにコピーする

cities.parquet ステージングされたデータファイルを CITIES テーブルにコピーします。

copy into cities from (select $1:continent::varchar, $1:country:name::varchar, $1:country:city::variant from @sf_tut_stage/cities.parquet); 
Copy

次の点に注意してください。

  • SELECT クエリの $1 は、Parquetデータが格納されている単一列を参照します。

  • クエリは、取得した各Parquet要素の値を特定の列の型にキャストします。

次のクエリを実行して、データがコピーされたことを検証します。

SELECT * from cities; 
Copy

クエリは次の結果を返します。

+---------------+---------+-----------------+ | CONTINENT | COUNTRY | CITY | |---------------+---------+-----------------| | Europe | France | [ | | | | "Paris", | | | | "Nice", | | | | "Marseilles", | | | | "Cannes" | | | | ] | |---------------+---------+-----------------| | Europe | Greece | [ | | | | "Athens", | | | | "Piraeus", | | | | "Hania", | | | | "Heraklion", | | | | "Rethymnon", | | | | "Fira" | | | | ] | |---------------+---------+-----------------| | North America | Canada | [ | | | | "Toronto", | | | | "Vancouver", | | | | "St. John's", | | | | "Saint John", | | | | "Montreal", | | | | "Halifax", | | | | "Winnipeg", | | | | "Calgary", | | | | "Saskatoon", | | | | "Ottawa", | | | | "Yellowknife" | | | | ] | +---------------+---------+-----------------+ 
Copy

テーブルをアンロードする

CITIES テーブルを別のParquetファイルにアンロードします。

注釈

デフォルトでSnowflakeは、すべての値を受け入れる最小の精度を設定することにより、アンロードされたParquetデータファイルにあるテーブル列を最適化します。「論理」列のデータ型(つまり、アンロード SQL クエリまたはソーステーブルの型)によって決定される一貫した出力ファイルスキーマを希望する場合は、 ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION セッションパラメーターを FALSE に設定します。

copy into @sf_tut_stage/out/parquet_ from (select continent, country, c.value::string as city from cities, lateral flatten(input => city) c) file_format = (type = 'parquet') header = true; 
Copy

次の点に注意してください。

  • file_format = (type = 'parquet') は、ステージ上のデータファイルの形式としてParquetを指定します。Parquetファイル型が指定されている場合は、デフォルトで COPY INTO <場所> コマンドにより、データが単一の列にアンロードされます。

  • header=true オプションは、出力ファイルに列名を保持するようにコマンドに指示します。

  • ネストされた SELECT クエリでは、

    • FLATTEN 関数は、最初に city 列の配列要素を個別の列にフラット化します。

    • LATERAL 修飾子は、 FLATTEN 関数の出力をオブジェクト外の情報(この例では continentcountry)に結合します。

次のクエリを実行して、データがステージされたParquetファイルにコピーされたことを検証します。

select t.$1 from @sf_tut_stage/out/ t; 
Copy

クエリは次の結果を返します(部分的な結果のみを表示)。

+---------------------------------+ | $1 | |---------------------------------| | { | | "CITY": "Paris", | | "CONTINENT": "Europe", | | "COUNTRY": "France" | | } | |---------------------------------| | { | | "CITY": "Nice", | | "CONTINENT": "Europe", | | "COUNTRY": "France" | | } | |---------------------------------| | { | | "CITY": "Marseilles", | | "CONTINENT": "Europe", | | "COUNTRY": "France" | | } | +---------------------------------+ 
Copy

正常にコピーされたデータファイルを削除する

ステージからテーブルにデータが正常にコピーされたことを確認した後に、 REMOVE コマンドを使用して内部ステージからデータファイルを削除し、 データストレージ を節約することができます。

REMOVE @sf_tut_stage/cities.parquet; 
Copy

クリーンアップする

次の DROP <オブジェクト> コマンドを実行して、システムをチュートリアルを開始する前の状態に戻します。

DROP DATABASE IF EXISTS mydatabase; DROP WAREHOUSE IF EXISTS mywarehouse; 
Copy

データベースをドロップすると、テーブルなどのすべての子データベースオブジェクトが自動的に削除されます。