Chargement et déchargement de données Parquet

Ce tutoriel décrit comment vous pouvez télécharger des données Parquet en transformant les éléments d’un fichier Parquet en zone de préparation directement en colonnes de table à l’aide de la commande COPY INTO <table>. Le tutoriel décrit également comment vous pouvez utiliser la commande COPY INTO <emplacement> pour décharger les données de la table dans un fichier Parquet.

Dans ce chapitre :

Conditions préalables

Pour ce tutoriel, vous devez :

  • Télécharger un fichier de données Parquet fourni par Snowflake.

  • Créer une base de données, une table et un entrepôt virtuel.

La base de données, la table et l’entrepôt virtuel sont des objets Snowflake de base nécessaires à la plupart des activités de Snowflake.

Téléchargement du fichier de données d’exemple

Pour télécharger le fichier de données d’exemple Parquet, cliquez sur cities.parquet. Vous pouvez également cliquer avec le bouton droit de la souris sur le lien et enregistrer le lien/fichier dans votre système de fichiers local.

Le tutoriel suppose que vous avez décompressé les fichiers dans les répertoires suivants :

  • Linux/macOS : /tmp/load

  • Windows : C:\\temp\load

Le fichier de données Parquet comprend des exemples de données de continent. Voici un exemple représentatif :

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

Création de la base de données, de la table et de l’entrepôt virtuel

Les commandes suivantes créent des objets spécifiquement pour ce tutoriel. Lorsque vous avez terminé le tutoriel, vous pouvez supprimer ces objets.

 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

Notez que ces commandes créent une table temporaire. Des tables temporaires ne persistent que pour la durée de la session utilisateur et ne sont pas visibles pour les autres utilisateurs.

Étape 1 : Créer un objet de format de fichier

Exécutez la commande CREATE FILE FORMAT pour créer le format de fichier sf_tut_parquet_format.

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format
  TYPE = parquet;
Copy

TYPE = 'parquet' indique le type de format du fichier source. CSV est le type de format de fichier par défaut.

Étape 2 : Créer un objet de zone de préparation

Exécutez la commande CREATE STAGE pour créer la zone de préparation sf_tut_stage interne.

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage
FILE_FORMAT = sf_tut_parquet_format;
Copy

Comme les tables temporaires, les zones de préparation temporaires sont automatiquement détruites à la fin de la session.

Étape 3 : Mettre le fichier de données en zone de préparation

Exécutez la commande PUT pour charger le fichier Parquet de votre système de fichiers local vers la zone de préparation nommée.

  • Linux ou macOS

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

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

Étape 4 : Copier les données dans la table cible

Copiez le fichier de données en zone de préparation cities.parquet dans la table CITIES.

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

Remarques :

  • $1 dans la requête SELECT fait référence à la colonne unique où sont stockées les données Parquet.

  • La requête convertit chacune des valeurs des éléments Parquet qu’elle récupère en types de colonnes spécifiques.

Exécutez la requête suivante pour vérifier que les données sont copiées.

SELECT * from cities;
Copy

La requête renvoie le résultat suivant :

+---------------+---------+-----------------+
| 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

Étape 5 : Décharger la table

Déchargez la table CITIES dans un autre fichier Parquet.

Note

Par défaut, Snowflake optimise les colonnes de la table dans les fichiers de données Parquet en réglant la plus petite précision qui accepte toutes les valeurs. Si vous préférez un schéma de fichier de sortie cohérent déterminé par les types de données de colonne « logique » (c’est-à-dire les types dans la requête de déchargement SQL ou la table source), définissez le paramètre de session ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION sur 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

Remarques :

  • Le file_format = (type = 'parquet') spécifie Parquet comme format du fichier de données sur la zone de préparation. Lorsque le type de fichier Parquet est spécifié, la commande COPY INTO <location> décharge les données par défaut dans une seule colonne.

  • L’option header=true indique à la commande de conserver les noms des colonnes dans le fichier de sortie.

  • Dans la requête imbriquée SELECT :

    • La fonction FLATTEN aplatit d’abord les éléments du tableau de la colonne city en colonnes distinctes.

    • Le modificateur LATERAL joint la sortie de la fonction FLATTEN à des informations extérieures à l’objet, dans cet exemple, continent et country.

Exécutez la requête suivante pour vérifier que les données sont copiées dans un fichier Parquet en zone de préparation.

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

La requête renvoie les résultats suivants (seul un résultat partiel est affiché) :

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

Étape 6 : Supprimer les fichiers de données copiés avec succès

Après avoir vérifié que vous avez bien copié les données de votre zone de préparation dans les tables, vous pouvez supprimer les fichiers de données de la zone de préparation interne en utilisant la commande REMOVE pour un enregistrement sur le stockage de données.

REMOVE @sf_tut_stage/cities.parquet;
Copy

Étape 7 : Nettoyer

Exécutez les commandes DROP <objet> suivantes pour remettre votre système dans son état initial avant de commencer le tutoriel :

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

Détruire la base de données supprime automatiquement toutes les objets de base de données liés, par exemple les tables.