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

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

ステップ1: ファイル形式オブジェクトを作成する

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

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format
  TYPE = parquet;
Copy

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

ステップ2: ステージオブジェクトを作成する

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

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage
FILE_FORMAT = sf_tut_parquet_format;
Copy

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

ステップ3: データファイルをステージングする

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

ステップ4: データをターゲットテーブルにコピーする

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 は、Paraquetデータが格納されている単一列を参照します。

  • クエリは、取得した各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

ステップ5: テーブルをアンロードする

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

ステップ6: 正常にコピーされたデータファイルを削除する

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

REMOVE @sf_tut_stage/cities.parquet;
Copy

ステップ7: クリーンアップする

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

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

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