Script : Chargement et déchargement de données Parquet

Les scripts annotés dans ce tutoriel décrivent un flux de travail de données Parquet :

  • Script 1. Charge des données d’échantillon Parquet vers des colonnes distinctes d’une table relationnelle directement à partir de fichiers de données préparées, évitant ainsi de devoir recourir à une table de mise en zone de préparation. Dans cet exemple, COPY INTO <table> charge des données séparées dans une paire de colonnes VARCHAR et une colonne VARIANT.

    Notez que le script inclut une instruction PUT, il ne peut donc pas être exécuté dans la page Worksheets Worksheet tab de l’interface Web Snowflake (ou toute autre interface qui ne prend pas en charge PUT). Au lieu de cela, nous vous recommandons d’utiliser SnowSQL, le client Snowflake CLI, pour exécuter le script.

  • Script 2. Décharge des données de table relationnelle Snowflake vers des colonnes distinctes d’un fichier Parquet. Lorsque le type de fichier Parquet est spécifié, COPY INTO <emplacement> effectue par défaut le déchargement vers une seule colonne.

Dans ce chapitre :

Conditions préalables

  • Un entrepôt virtuel actif et fonctionnel.

  • Échantillon de fichier de données Parquet (cities.parquet). Si cliquer sur le lien ne télécharge pas le fichier, cliquez avec le bouton droit sur le lien et enregistrez le lien/le fichier sur votre système de fichiers local.

    Copiez ensuite le fichier dans votre dossier/répertoire temporaire :

    • macOS ou Linux : //tmp

    • Windows : ouvrez une fenêtre d’explorateur et saisissez %TEMP% dans la barre d’adresse.

Exemple de données d’échantillon

Ce qui suit est une ligne représentative dans le fichier d’échantillon Parquet :

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

SQL Script 1 : Charger les données Parquet

Note

L’instruction PUT dans ce script suppose que vous utilisez un environnement macOS ou Linux. Si vous utilisez Windows, ajustez l’instruction comme indiqué dans les commentaires.

/* Create a target relational table for the Parquet data. The table is temporary, meaning it persists only    */
/* for the duration of the user session and is not visible to other users.                                    */

create or replace temporary table cities (
  continent varchar default NULL,
  country varchar default NULL,
  city variant default NULL
);

/* Create a file format object that specifies the Parquet file format type.                                   */
/* Accepts the default values for other options.                                                              */

create or replace file format sf_tut_parquet_format
  type = 'parquet';

/* Create a temporary internal stage that references the file format object.                                  */
/* Similar to temporary tables, temporary stages are automatically dropped at the end of the session.         */

create or replace temporary stage sf_tut_stage
  file_format = sf_tut_parquet_format;

/* Stage the data file.                                                                                       */
/*                                                                                                            */
/* Note that the example PUT statement references the macOS or Linux location of the data file.               */
/* If you are using Windows, execute the following statement instead:                                         */

-- put %TEMP%/cities.parquet @sf_tut_stage;

put file:///tmp/cities.parquet @sf_tut_stage;

/* Load the Parquet data into the relational table.                                                           */
/*                                                                                                            */
/* A SELECT query in the COPY statement identifies a numbered set of columns in the data files you are        */
/* loading from. Note that all Parquet data is stored in a single column ($1).                                */
/*                                                                                                            */
/* Cast element values to the target column data type.                                                        */

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

/* Query the relational table                                                                                 */

SELECT * from cities;

SQL Script 2 : Décharger les données 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.

/* Unload the CITIES table columns into a Parquet file. Optionally flatten the CITY column array and unload   */
/* the child elements to a separate column.                                                                   */
/*                                                                                                            */
/* To retain the column names in the output file, use the HEADER = TRUE copy option.                          */

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

/* Query the staged Parquet file.                                                                             */

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