Externe Tabellen mit Partitionierung der Quelldatei

In Autonomous Database können Sie partitionierte externe Tabellen aus partitionierten Daten im Hive-Stil oder aus einfachen, in Ordner partitionierten Daten erstellen, die in Ihrem Cloud-Objektspeicher gespeichert sind.

Bei der Partitionierung von Quelldateien werden bei bestimmten Dateimustern anstelle einer vollständigen Partitionsspezifikation Partitionierungsinformationen aus dem Dateipfad abgeleitet. Betrachten Sie beispielsweise die folgenden Datendateispezifikationen:

  • Hive-Stil: Beispiel: sales/country=USA/year=2020/month=01/file1.csv

  • Einfacher Ordnerpartitionierungsstil: Beispiel: sales/USA/2020/01/file1.parquet

Die Verwendung eines dieser gängigen Partitionierungsformate vereinfacht die Erstellung und Verwaltung partitionierter externer Tabellen erheblich. Auch wenn Partitionsspalten möglicherweise nicht in der Datendatei angezeigt werden, können sie dennoch mit SQL abgefragt werden. Durch die Partitionierung von Daten wird auch die Abfrageperformance verbessert, indem die gescannte Datenmenge drastisch reduziert wird. Wenn Sie in diesem Beispiel "USA"-Daten abfragen, kann die Abfrage das Scannen der Dateien für andere Länder überspringen.

Partitionierte Daten im Cloud-Objektspeicher im Hive-Format

Hive bietet ein Standard-Metadatenformat für Big-Data-Verarbeitungs-Engines. Partitionierte Daten im Cloud-Objektspeicher, die im Hive-Format generiert werden, werden im folder/subfolder-Format dargestellt. Beispiel: Im Cloud-Objektspeicher wird eine Datendatei im Hive-Format wie folgt gespeichert:

table/partition1=partition1_value/partition2=partition2_value/data_file.csv

Dateien, die im partitionierten Hive-Format gespeichert sind, stellen Partitionsinformationen im Namen des Datendateipfads bereit. Der Datendateipfadname enthält Informationen über den Objektinhalt, einschließlich Partitionsspaltennamen und Partitionsspaltenwerten (die Datendatei enthält nicht die Partitionsspalten und die zugehörigen Werte).

Beispiel: Eine externe partitionierte Tabelle SALES, die aus Daten im Hive-Format im Cloud-Objektspeicher erstellt wurde:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

Die Partitionsinformationen im Hive-Format zeigen, dass die Datendateien im Cloud-Objektspeicher nach country, year und month partitioniert sind und die Werte für diese Partitionsspalten auch innerhalb des Pfadnamens im Hive-Format für jede Datendatei angegeben werden (der Pfadname enthält Werte für die partitionierten Spalten: country, year und month).

Die Spaltennamen im Pfad werden von der API verwendet, um die Tabellendefinition zu vereinfachen.

Partitionierte Daten im Cloud-Objektspeicher im einfachen Ordnerformat

Partitionierte Daten im Cloud-Objektspeicher, die im Ordnerformat generiert werden, werden in einem folder/subfolder-Format dargestellt, ähnlich wie partitionierte Daten im Hive-Format. Die Informationen im Pfad zeigen jedoch die Spaltenwerte an und enthalten keine Spaltennamen. Außerdem ist bei partitionierten Daten im Ordnerformat die im Objektnamen angegebene Partitionsreihenfolge signifikant und muss mit der Reihenfolge in den Tabellenspalten übereinstimmen.

Beispiel: Im Cloud-Objektspeicher wird eine Datendatei im Ordnerformat wie folgt gespeichert:

table/partition1_value/partition2_value/*.parquet

Der Pfad enthält sowohl Partitionsspaltenwerte in der Reihenfolge der Partitionsspalten als auch die Datendateien. Mit Autonomous Database können Sie eine externe partitionierte Tabelle aus Daten im Ordnerformat erstellen. Außerdem können Sie eine Abfrage mit den angegebenen Partitionen ausführen.

Dateien, die im Partitionierungsformat des Ordners gespeichert sind, geben die Spaltenwerte der Datenpartition im Dateinamen an. Im Gegensatz zu Hive enthalten die Pfade nicht den Spaltennamen, daher müssen die Spaltennamen angegeben werden. Die Reihenfolge der Partitionsspalten ist wichtig, und die Reihenfolge im Dateinamen für Spaltenpartitionsnamen muss mit der Reihenfolge im Parameter partition_columns übereinstimmen.

Informationen zum Abfragen partitionierter Daten im Cloud-Objektspeicher

Wenn Sie externe partitionierte Daten im Hive-Format abfragen, versteht und verwendet die Abfrage-Engine die Partitionierungsinformationen aus dem Dateipfadnamen. Beispiel: Eine externe partitionierte Tabelle SALES, in der die Quelldatei sales/country=USA/year=2020/month=02/file3.csv im Objektspeicher die folgenden Umsatzdaten enthält:

tents, 291
canoes, 22
backpacks, 378

Die country-Werte im Pfadnamen und die Zeitperiodenwerte für month und year werden nicht als Spalten in der Datendatei angegeben. Die Werte der Partitionsspalte werden nur im Pfadnamen mit den angezeigten Werten angegeben: USA, 2020 und 02. Nachdem Sie eine externe partitionierte Tabelle mit dieser Datendatei erstellt haben, können Sie die Partitionsspalten und deren Werte verwenden, wenn Sie eine Abfrage für die externe partitionierte Tabelle ausführen.

Beispiel:

SELECT year, month, product, units 
     FROM SALES WHERE year='2020' AND month='02' AND country='USA'

Der Vorteil der Erstellung einer externen partitionierten Tabelle mit Daten, die als partitionierte Daten im Hive-Format generiert werden, besteht darin, dass die Abfrage-Engine optimiert ist, um die Daten zu partitionieren und die richtige Partition auszuwählen. Die Abfrage wählt nur Daten aus einer Partition aus und muss nur eine einzelne Datendatei durchsuchen. Daher erfordert die Abfrage nur einen Scan der Datei file3.csv (/sales/country=USA/year=2020/month=02/file3.csv). Bei großen Datenmengen kann ein solches Partitions-Pruning erhebliche Leistungsverbesserungen bewirken.

Wenn externe Standardtabellen von Oracle Database verwendet werden, muss die Partitionsspalte als Spalte in der Datendatei verfügbar sein, damit sie für Abfragen oder Partitionsdefinitionen verwendet werden kann. Ohne die besondere Behandlung, die mit externen partitionierten Tabellen in Autonomous Database verfügbar ist, wäre dies ein Problem, wenn Sie Daten verwenden möchten, die im Hive-Format im Cloud Object Store gespeichert sind, da Sie die Datendateien neu generieren müssen, um die Partition als Spalte in die Datendatei aufzunehmen.

Partitionierte externe Tabellen erstellen

Wenn Sie unstrukturierte Daten verwenden, die im Hive-Format im Cloud-Objektspeicher gespeichert sind, und eine externe partitionierte Tabelle erstellen, können die Spalten und ihre Typen nicht aus der Quelldatei abgeleitet werden. Daher müssen die Spalten und ihre Datentypen mit dem Parameter column_list angegeben werden. Um die partitionierten externen Tabellen zu erstellen, geben Sie die Partitionsspalten und deren Typen wie folgt mit der Prozedur DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE an:

  • Die Root für die Dateiliste wird im Pfadnamen mit dem Parameter file_uri_list angegeben. Beispiel: http://.../sales/*

  • Die Spaltennamen und Datentypen werden mit dem Parameter column_list angegeben.

  • Die Option partition_columns im Parameter format gibt die Partitionsspalten an.

  • Die generierte DLL enthält die im Pfadnamen angegebenen Spalten.

In diesem Beispiel werden beim Erstellen der externen Tabelle die Spalten country, year und month im Parameter column_list hinzugefügt. Die externe Tabelle wird mit den Spalten country, year und month erstellt, die nicht in den Datendateien enthalten sind, und Listenpartitionen werden erstellt, um das Partitions-Pruning zu aktivieren.

Wenn Sie strukturierte Daten wie Parquet-, Avro- oder ORC-Dateien verwenden, die im Ordnerformat im Cloud-Objektspeicher gespeichert sind, sind die Spalten und ihre Datentypen bekannt. Sie müssen die Spaltenliste nicht wie bei unstrukturierten Daten erforderlich angeben. Um die partitionierten externen Tabellen zu erstellen, geben Sie die Partitionsspalten und deren Typen wie folgt mit der Prozedur DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE an:

  • Die Root für die Dateiliste wird im Pfadnamen mit dem Parameter file_uri_list angegeben. Beispiel: http://.../sales/*
  • Der Parameter column_list ist für strukturierte Dateien nicht erforderlich. Wenn Sie die Spaltenliste nicht angeben, müssen Sie beim Erstellen der externen partitionierten Tabelle die Partitionsspalten und deren Datentypen definieren. Verwenden Sie die Option partition_columns im Parameter format, um die Partitionsspalten und ihre Datentypen anzugeben.
  • Die generierte DLL enthält die im Pfadnamen angegebenen Spalten.

Vollständige Beispiele finden Sie unter Externe partitionierte Daten mit Quelldatei-Organisation im Hive-Format abfragen und Externe partitionierte Daten mit Quelldatei-Organisation im Ordnerformat abfragen.

Externe Partitionierung: CSV-Quelldateien mit Ordnern im Hive-Stil

Zeigt, wie externe partitionierte Tabellen mit CSV-Quelldateien erstellt werden, die im Cloud Object Store in Hive-Ordnern gespeichert sind.

Liste der Quelldateien:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
Hinweis

Die partition_columns im Parameter format muss mit den Spaltennamen im Pfad übereinstimmen (Beispiel: Die Spalte country entspricht "country=…").

Externe Partitionierung: CSV-Quelldateien mit einfachen Ordnern

Zeigt, wie Sie externe partitionierte Tabellen mit CSV-Quelldateien erstellen, die im Cloud-Objektspeicher im einfachen Ordnerformat gespeichert sind.

Liste der Quelldateien:

.../sales/USA/2020/01/file1.csv
.../sales/USA/2020/01/file2.csv
.../sales/USA/2020/02/file3.csv
.../sales/USA/2020/03/file1.csv
.../sales/FRA/2020/03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE(
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     =>  'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
Hinweis

Der API-Aufruf ist mit dem im vorherigen Beispiel identisch, aber die Reihenfolge der partition_columns im Parameter format ist wichtig, da sich der Spaltenname nicht im Dateipfad befindet.

Externe Partitionierung: Parquet-Quelldateien mit Ordnern im Hive-Stil

Zeigt, wie Sie externe partitionierte Tabellen mit Parquet-Quelldateien erstellen, die im Cloud Object Store in Hive-Ordnern gespeichert sind.

Liste der Quelldateien:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name            => 'mysales',
     credential_name     => 'mycredential', 
     file_uri_list       => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet',
     format              => 
         json_object(    'type' value 'parquet', 
               'schema' value 'first',
               'partition_columns' value 
                  json_array(
                      json_object('name' value 'country', 'type' value 'varchar2(100)'),
                      json_object('name' value 'year', 'type' value 'number'),
                      json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
Hinweis

Der Parameter column_list ist nicht angegeben. Wie gezeigt, geben Sie für jede Partitionsspalte sowohl den Namen als auch den Datentyp im Parameter format partition_columns an.

Externe Partitionierung: Parquet mit einfachen Ordnern

Zeigt, wie Sie externe partitionierte Tabellen mit Parquet-Quelldateien erstellen, die im Cloud-Objektspeicher im einfachen Ordnerformat gespeichert sind.

Liste der Quelldateien:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet', 
   format            => 
     json_object(    'type' value 'parquet', 
                'schema' value 'first',
         'partition_columns' value 
           json_array(
              json_object('name' value 'country', 'type' value 'varchar2(100)'),
              json_object('name' value 'year', 'type' value 'number'),
              json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
Hinweis

Der Parameter column_list ist nicht angegeben. Sie müssen sowohl den Namen als auch den Datentyp für die Partitionsspalten angeben. Außerdem ist die Reihenfolge der partition_columns in der Formatklausel wichtig, da sich der Spaltenname nicht im Dateipfad befindet.