Laden und Entladen von Parquet-Daten

In diesem Tutorial wird beschrieben, wie Sie Parquet-Daten hochladen können, indem Sie Elemente einer im Stagingbereich bereitgestellten Parquet-Datei mit dem Befehl COPY INTO <Tabelle> direkt in Tabellenspalten transformieren. Das Tutorial beschreibt auch, wie Sie den Befehl COPY INTO <Speicherort> verwenden können, um Tabellendaten in eine Parquet-Datei zu entladen.

Unter diesem Thema:

Voraussetzungen

Für dieses Tutorial müssen Sie Folgendes tun:

  • Herunterladen einer von Snowflake bereitgestellten Parquet-Datendatei.

  • Erstellen einer Datenbank, einer Tabelle und eines virtuellen Warehouses.

Datenbank, Tabelle und virtuelles Warehouse sind grundlegende Snowflake-Objekte, die für die meisten Snowflake-Aktivitäten benötigt werden.

Herunterladen der Beispieldatendatei

Laden Sie die Parquet-Beispieldatendatei herunter, indem Sie aus cities.parquet klicken. Alternativ können Sie auch mit der rechten Maustaste auf den Link klicken und den Link/die Datei in Ihrem lokalen Dateisystem speichern.

Das Tutorial setzt voraus, dass Sie die Dateien in die folgenden Verzeichnisse entpackt haben:

  • Linux/macOS: /tmp/load

  • Windows: C:\tempload

Die Parquet-Datendatei enthält Beispieldaten zum Kontinent („continent“). Das folgende Beispiel ist repräsentativ:

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

Erstellen von Datenbank, Tabelle und virtuellem Warehouse

Mit dem folgenden Skript werden Objekte speziell für die Verwendung mit diesem Tutorial erstellt. Wenn Sie das Tutorial abgeschlossen haben, können Sie diese Objekte wieder löschen.

 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

Beachten Sie, dass diese Befehle eine temporäre Tabelle erstellen. Eine temporäre Tabelle bleibt nur für die Dauer der Benutzersitzung bestehen, in der sie erstellt wurde. Sie ist für andere Benutzer nicht sichtbar.

Schritt 1: Dateiformatobjekt erstellen

Führen Sie den Befehl CREATE FILE FORMAT aus, um das Dateiformat sf_tut_parquet_format zu erstellen.

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format
  TYPE = parquet;
Copy

TYPE = 'parquet' gibt den Dateiformattyp der Quelldatei an. CSV ist der Standard-Dateiformattyp.

Schritt 2: Stagingobjekt erstellen

Führen Sie den Befehl CREATE STAGE aus, um den internen Stagingbereich sf_tut_stage zu erstellen.

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage
FILE_FORMAT = sf_tut_parquet_format;
Copy

Ähnlich wie bei temporären Tabellen werden temporäre Stagingbereiche am Ende der Sitzung automatisch gelöscht.

Schritt 3: Datendatei im Stagingbereich bereitstellen

Führen Sie den PUT-Befehl aus, um die Parquet-Datei aus Ihrem lokalen Dateisystem in den benannten Stagingbereich hochzuladen.

  • Linux oder macOS

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

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

Schritt 4: Daten in die Zieltabelle kopieren

Kopieren Sie die Staging-Datendatei cities.parquet in die Tabelle CITIES.

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

Beachten Sie Folgendes:

  • Der Term $1 in der SELECT-Abfrage bezieht sich auf die einzelne Spalte, in der die Parquet-Daten gespeichert sind.

  • Die Abfrage wandelt jeden der abgerufenen der Parquet-Elementwerte in bestimmte Spaltentypen um.

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Daten kopiert wurden.

SELECT * from cities;
Copy

Die Abfrage gibt das folgende Ergebnis zurück:

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

Schritt 5: Tabelle entladen

Entladen Sie die Tabelle CITIES in eine andere Parquet-Datei.

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.

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

Beachten Sie Folgendes:

  • Mit file_format = (type = 'parquet') wird „Parquet“ als das Format der Datendatei in dem Stagingbereich festgelegt. (Wenn der Parquet-Dateityp angegeben ist, werden mit dem Befehl COPY INTO <Speicherort> die Daten standardmäßig in eine einzelne Spalte entladen.)

  • Die Option header=true weist den Befehl an, die Spaltennamen in der Ausgabedatei beizubehalten.

  • Bei einer verschachtelten SELECT-Abfrage:

    • Mit der Funktion FLATTEN werden zunächst die Elemente des Spaltenarrays city in separaten Spalten vereinfacht.

    • Die Ausgabe der FLATTEN-Funktion kann dann mithilfe des LATERAL-Modifikators mit beliebigen Informationen außerhalb des Objekts verknüpft werden – in diesem Beispiel mit continent und country.

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Daten in Parquet-Dateien im Stagingbereich kopiert wurden.

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

Die Abfrage gibt die folgenden Ergebnisse zurück (es wird nur ein Teilergebnis angezeigt):

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

Schritt 6: Erfolgreich kopierte Datendateien entfernen

Nachdem Sie sich vergewissert haben, dass Sie die Daten erfolgreich aus Ihrem Stagingbereich in die Tabellen kopiert haben, können Sie die Datendateien mit dem Befehl REMOVE aus dem internen Stagingbereich entfernen, um Datenspeicher zu sparen.

REMOVE @sf_tut_stage/cities.parquet;
Copy

Schritt 7: Bereinigen

Führen Sie die folgenden DROP <Objekt>-Befehle aus, um Ihr System in den Zustand zu versetzen, bevor Sie das Tutorial begonnen haben:

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

Wenn Sie die Datenbank löschen, werden automatisch alle untergeordneten Datenbankobjekte wie Tabellen entfernt.