Skript: Laden und Entladen von Parquet-Daten

Die kommentierten Skripte in diesem Tutorial beschreiben einen Workflow für Parquet-Daten:

  • Skript 1: Lädt Parquet-Beispieldaten direkt aus Staging-Datendateien in separate Spalten einer relationalen Tabelle, wodurch die Notwendigkeit einer Staging-Tabelle entfällt. In diesem Beispiel werden mit COPY INTO <Tabelle> separate Daten in ein Paar von VARCHAR-Spalten und einer VARIANT-Spalte geladen.

    Beachten Sie, dass das Skript eine PUT-Anweisung enthält, sodass es nicht auf der Seite Worksheets Worksheet tab der Snowflake-Weboberfläche (oder auf anderen Oberflächen, die PUT nicht unterstützen) ausgeführt werden kann. Stattdessen empfehlen wir die Verwendung von SnowSQL, dem Snowflake-CLI-Client, um das Skript auszuführen.

  • Skript 2: Entlädt relationale Snowflake-Tabellendaten in separate Spalten einer Parquet-Datei. (Wenn der Parquet-Dateityp angegeben ist, wird COPY INTO <Speicherort> standardmäßig in eine einzelne Spalte entladen.)

Unter diesem Thema:

Voraussetzungen

  • Erfordert ein aktives virtuelles Warehouse.

  • Beispiel einer Parquet-Datendatei (cities.parquet). Wenn die Datei durch Klicken auf den Link nicht heruntergeladen werden kann, klicken Sie mit der rechten Maustaste auf den Link, und speichern Sie den Link bzw. die Datei in Ihrem lokalen Dateisystem.

    Kopieren Sie dann die Datei in Ihren temporären Ordner:

    • macOS oder Linux: //tmp

    • Windows: Öffnen Sie ein Explorer-Fenster, und geben Sie in der Adressleiste %TEMP% ein.

Beispieldaten

Im Folgenden wird eine repräsentative Zeile aus der Parquet-Beispieldatei angezeigt:

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

SQL-Skript 1: Parkettdaten laden

Bemerkung

Die PUT-Anweisung in diesem Skript geht davon aus, dass Sie eine macOS- oder Linux-Umgebung verwenden. Wenn Sie Windows verwenden, passen Sie die Anweisung an, wie in den Kommentaren angegeben.

/* 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-Skript 2: Parkettdaten entladen

Bemerkung

Snowflake optimiert Tabellenspalten, indem die kleinste Genauigkeit festgelegt wird, die alle Werte akzeptiert. Wenn Sie ein konsistentes Ausgabedateischema bevorzugen, das durch die Datentypen der „logischen“ Spalte bestimmt wird (d. h. die Typen in der SQL-Entladeabfrage oder in der Quelltabelle), setzen Sie den Sitzungsparameter ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION auf 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;