Datentypen in Amazon Athena - Amazon Athena

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Datentypen in Amazon Athena

Beim Ausführen CREATE TABLE geben Sie Spaltennamen und den Datentyp an, den jede Spalte enthalten kann. Die Tabellen, die Sie erstellen, werden in der gespeichert AWS Glue Data Catalog.

Um die Interoperabilität mit anderen Abfrage-Engines zu erleichtern, verwendet Athena Apache Hive-Datentypnamen für DDL-Anweisungen wie. CREATE TABLE Für DML-Abfragen wie SELECT CTASINSERT INTO, und verwendet Athena Trino-Datentypnamen. Die folgende Tabelle zeigt die in Athena unterstützten Datentypen. Wenn sich DDL- und DML-Typen in Bezug auf Namen, Verfügbarkeit oder Syntax unterscheiden, werden sie in separaten Spalten angezeigt.

DDL DML Beschreibung
BOOLEAN Die Werte sind true und false.
TINYINT Eine 8-Bit-Ganzzahl mit Vorzeichen im Zweierkomplementformat mit einem Mindestwert von -2 7 und einem Höchstwert von 2 7 -1.
SMALLINT Eine 16-Bit-Ganzzahl mit Vorzeichen im Zweierkomplementformat mit einem Mindestwert von -2 15 und einem Höchstwert von 2 15 -1.
INT, INTEGER Ein 32-Bit-Wert mit Vorzeichen im Zweierkomplementformat mit einem Mindestwert von -2 31 und einem Höchstwert von 2 31 -1.
BIGINT Eine 64-Bit-Ganzzahl mit Vorzeichen im Zweierkomplementformat mit einem Mindestwert von -2 63 und einem Höchstwert von 2 63 -1.
FLOAT REAL Eine 32-Bit-Gleitkommazahl mit Vorzeichen und einfacher Genauigkeit. Der Bereich liegt zwischen 1,40129846432481707e-45 und 3,40282346638528860e+38, positiv oder negativ. Entspricht dem IEEE-Standard für Gleitkomma-Arithmetik (IEEE 754).
DOUBLE Eine 64-Bit-Gleitkommazahl mit Vorzeichen und doppelter Genauigkeit. Der Bereich reicht von 4,94065645841246544e-324d bis 1,79769313486231570e+308d, positiv oder negativ. Entspricht dem IEEE-Standard für Gleitkomma-Arithmetik (IEEE 754).
DECIMAL (Genauigkeit, Skala) precisionist die Gesamtzahl der Ziffern. scale(optional) ist die Anzahl der Ziffern in Nachkommastellen mit dem Standardwert 0. Verwenden Sie z. B. diese Definitionen: decimal(11,5), decimal(15). Die maximale Wert der Genauigkeit ist 38 und der maximale Wert für die Skalierung beträgt 38.
CHAR, CHAR (Länge)

Zeichendaten mit fester Länge und einer angegebenen Länge zwischen 1 und 255, z. B. char (10). Wenn eine Länge angegeben ist, werden Zeichenketten beim Lesen auf die angegebene Länge gekürzt. Wenn die zugrunde liegende Datenzeichenfolge länger ist, bleibt die zugrunde liegende Datenzeichenfolge unverändert.

Weitere Informationen finden Sie unter CHAR-Hive-Datentyp.

STRING VARCHAR Zeichendaten mit variabler Länge.
VARCHAR (Länge) Zeichendaten variabler Länge mit einer maximalen Leselänge. Zeichenketten werden beim Lesen auf die angegebene Länge gekürzt. Wenn die zugrunde liegende Datenzeichenfolge länger ist, bleibt die zugrunde liegende Datenzeichenfolge unverändert.
BINARY VARBINARY Binärdaten mit variabler Länge.
TIME Eine Tageszeit mit Millisekundengenauigkeit.
Nicht verfügbar ZEIT (Genauigkeit) Eine Tageszeit mit einer bestimmten Genauigkeit. TIME(3)ist gleichwertig mitTIME.
Nicht verfügbar TIME WITH TIME ZONE Eine Tageszeit in einer Zeitzone. Zeitzonen sollten als Offsets von UTC angegeben werden.
DATUM Ein Kalenderdatum mit Jahr, Monat und Tag.
TIMESTAMP (ZEITSTEMPEL) ZEITSTEMPEL, ZEITSTEMPEL OHNE ZEITZONE Ein Kalenderdatum und eine Uhrzeit mit Millisekundengenauigkeit.
Nicht verfügbar TIMESTAMP (Genauigkeit), TIMESTAMP (Genauigkeit) OHNE ZEITZONE Ein Kalenderdatum und eine Uhrzeit mit einer bestimmten Genauigkeit. TIMESTAMP(3)entsprichtTIMESTAMP.
Nicht verfügbar TIMESTAMP WITH TIME ZONE Ein Kalenderdatum und eine Uhrzeit in einer Zeitzone. Zeitzonen können als Abweichungen von UTC, als IANA-Zeitzonennamen oder mit UTC, UT, Z oder GMT angegeben werden.
Nicht verfügbar ZEITSTEMPEL (PRÄZISION) MIT ZEITZONE Ein Kalenderdatum und eine Uhrzeit mit einer bestimmten Genauigkeit in einer Zeitzone.
Nicht verfügbar INTERVAL YEAR TO MONTH Ein Intervall von einem oder mehreren ganzen Monaten
Nicht verfügbar INTERVAL DAY TO SECOND Ein Intervall von einer oder mehreren Sekunden, Minuten, Stunden oder Tagen
ARRAY< element_type > ARRAY [Elementtyp] Ein Array von Werten. Alle Werte müssen denselben Typ haben.
MAP< Schlüsseltyp, Wertetyp > MAP (Schlüsseltyp, Werttyp) Eine Map, in der Werte nach Schlüsseln gesucht werden können. Alle Schlüssel müssen denselben Wert haben und alle Werte müssen denselben Wert haben.
STRUCT< Feldname_1: Feldtyp_1, Feldname_2: Feldtyp_2,... > ROW (Feldname_1 Feldtyp_1, Feldname_2 Feldtyp_2,...) Eine Datenstruktur mit benannten Feldern und ihren Werten.
Nicht verfügbar JSON JSON-Wertetyp, bei dem es sich um ein JSON-Objekt, ein JSON-Array, eine JSON-Nummer, eine JSON-Zeichenfolge false oder handeln kannnull. true
Nicht verfügbar UUID Eine UUID (Universally Unique IDentifier).
Nicht verfügbar IP-ADRESSE Eine IPv4- oder IPv6-Adresse.
Nicht verfügbar HyperLogLog Diese Datentypen unterstützen ungefähre Funktionsinterna. Weitere Informationen zu den einzelnen Typen finden Sie unter dem Link zum entsprechenden Eintrag in der Trino-Dokumentation.
P4 HyperLogLog
SetDigest
Q Digest
TDigest

Beispiele für Datentypen

Die folgende Tabelle zeigt Beispielliterale für DML-Datentypen.

Datentyp Beispiele
BOOLEAN

true

false

TINYINT

TINYINT '123'

SMALLINT

SMALLINT '123'

INT, INTEGER

123456790

BIGINT

BIGINT '1234567890'

2147483648

REAL

'123456.78'

DOUBLE

1.234

DECIMAL (Genauigkeit, Skala)

DECIMAL '123.456'

CHAR, CHAR (Länge)

CHAR 'hello world', CHAR 'hello ''world''!'

VARCHAR, VARCHAR (Länge)

VARCHAR 'hello world', VARCHAR 'hello ''world''!'

VARBINARY

X'00 01 02'

ZEIT, ZEIT (Genauigkeit)

TIME '10:11:12', TIME '10:11:12.345'

TIME WITH TIME ZONE

TIME '10:11:12.345 -06:00'

DATUM

DATE '2024-03-25'

TIMESTAMP, TIMESTAMP OHNE ZEITZONE, TIMESTAMP (Genauigkeit), TIMESTAMP (Genauigkeit) OHNE ZEITZONE

TIMESTAMP '2024-03-25 11:12:13', TIMESTAMP '2024-03-25 11:12:13.456'

ZEITSTEMPEL MIT ZEITZONE, ZEITSTEMPEL (PRÄZISION) MIT ZEITZONE

TIMESTAMP '2024-03-25 11:12:13.456 Europe/Berlin'

INTERVAL YEAR TO MONTH

INTERVAL '3' MONTH

INTERVAL DAY TO SECOND

INTERVAL '2' DAY

ARRAY [Elementtyp]

ARRAY['one', 'two', 'three']

MAP (Schlüsseltyp, Werttyp)

MAP(ARRAY['one', 'two', 'three'], ARRAY[1, 2, 3])

Beachten Sie, dass Maps aus einem Array von Schlüsseln und einem Array von Werten erstellt werden.

ROW (Feldname_1 Feldtyp_1, Feldname_2 Feldtyp_2,...)

ROW('one', 'two', 'three')

Beachten Sie, dass auf diese Weise erstellte Zeilen keine Spaltennamen haben. Um Spaltennamen hinzuzufügen, können Sie wie im folgenden Beispiel Folgendes verwendenCAST:

CAST(ROW(1, 2, 3) AS ROW(one INT, two INT, three INT))
JSON

JSON '{"one":1, "two": 2, "three": 3}'

UUID

UUID '12345678-90ab-cdef-1234-567890abcdef'

IP-ADRESSE

IPADDRESS '10.0.0.1'

IPADDRESS '2001:db8::1'

Überlegungen zu Datentypen

Größenbeschränkungen

Beachten Sie bei Datentypen, für die keine Größenbeschränkung angegeben ist, dass es für alle Daten in einer einzelnen Zeile eine praktische Grenze von 32 MB gibt. Weitere Informationen finden Sie unter Row or column size limitation in Überlegungen und Einschränkungen für SQL-Abfragen in Amazon Athena.

CHAR und VARCHAR

Ein CHAR(n) Wert hat immer eine Anzahl von Zeichen. n Wenn Sie beispielsweise 'abc' in umwandelnCHAR(7), werden 4 abschließende Leerzeichen hinzugefügt.

Vergleiche von CHAR Werten beinhalten führende und nachfolgende Leerzeichen.

Wenn für CHAR oder eine Länge angegeben wirdVARCHAR, werden Zeichenketten beim Lesen auf die angegebene Länge gekürzt. Wenn die zugrunde liegende Datenzeichenfolge länger ist, bleibt die zugrunde liegende Datenzeichenfolge unverändert.

Um ein einfaches Anführungszeichen in einem CHAR Oder zu maskierenVARCHAR, verwenden Sie ein zusätzliches einfaches Anführungszeichen.

Um einen Datentyp, der keine Zeichenfolge ist, in einer DML-Abfrage in eine Zeichenfolge umzuwandeln, müssen Sie in den VARCHAR Datentyp umwandeln.

Um mit der substr Funktion eine Teilzeichenfolge der angegebenen Länge aus einem CHAR Datentyp zurückzugeben, müssen Sie den CHAR Wert zunächst in ein umwandeln. VARCHAR Im folgenden Beispiel wird der CHAR Datentyp col1 verwendet.

substr(CAST(col1 AS VARCHAR), 1, 4)

DECIMAL

Um Dezimalwerte in SELECT Abfragen als Literale anzugeben, z. B. bei der Auswahl von Zeilen mit einem bestimmten Dezimalwert, können Sie den DECIMAL Typ angeben und den Dezimalwert in Ihrer Abfrage als Literal in einfachen Anführungszeichen auflisten, wie in den folgenden Beispielen.

SELECT * FROM my_table WHERE decimal_value = DECIMAL '0.12'
SELECT DECIMAL '44.6' + DECIMAL '77.2'

Mit Zeitstempeldaten arbeiten

In diesem Abschnitt werden einige Überlegungen zur Arbeit mit Zeitstempeldaten in Athena beschrieben.

Anmerkung

Die Behandlung von Zeitstempeln hat sich zwischen der Athena-Engine-Version 2 und der Athena-Engine-Version 3 etwas geändert. Informationen zu Fehlern im Zusammenhang mit Zeitstempeln, die in Athena-Engine-Version 3 auftreten können, sowie Lösungsvorschläge finden Sie unter Änderungen des Zeitstempels in der Athena-Engine-Version 3-Referenz.

Format für das Schreiben von Zeitstempeldaten in Amazon-S3-Objekte

Das Format, in dem Zeitstempeldaten in Amazon S3 S3-Objekte geschrieben werden sollen, hängt sowohl vom Spaltendatentyp als auch von der verwendeten SerDeBibliothek ab.

  • Wenn Sie eine Tabellenspalte vom Typ DATE haben, erwartet Athena, dass es sich bei der entsprechenden Spalte oder Eigenschaft der Daten um eine Zeichenfolge im ISO-Format YYYY-MM-DD oder um einen integrierten Datumstyp wie bei Parquet oder ORC handelt.

  • Wenn Sie eine Tabellenspalte vom Typ TIME haben, erwartet Athena, dass es sich bei der entsprechenden Spalte oder Eigenschaft der Daten um eine Zeichenfolge im ISO-Format HH:MM:SS oder um einen integrierten Zeittyp wie bei Parquet oder ORC handelt.

  • Wenn Sie eine Tabellenspalte des Typs TIMESTAMP haben, erwartet Athena, dass die entsprechende Spalte oder Eigenschaft der Daten eine Zeichenkette im Format YYYY-MM-DD HH:MM:SS.SSS ist (beachten Sie das Leerzeichen zwischen Datum und Uhrzeit), oder ein eingebauter Zeittyp wie die für Parquet, ORC oder Ion.

    Anmerkung

    SerDe OpenCSV-Zeitstempel sind eine Ausnahme und müssen als UNIX-Epochen mit Millisekundenauflösung codiert werden.

Sicherstellen, dass zeitlich aufgeteilte Daten mit dem Zeitstempelfeld in einem Datensatz übereinstimmen

Der Hersteller der Daten muss sicherstellen, dass die Partitionswerte mit den Daten innerhalb der Partition übereinstimmen. Wenn Ihre Daten beispielsweise eine timestamp Eigenschaft haben und Sie Firehose verwenden, um die Daten in Amazon S3 zu laden, müssen Sie dynamische Partitionierung verwenden, da die Standardpartitionierung von Firehose wall-clock-based

String als Datentyp für Partitionsschlüssel verwenden

Aus Leistungsgründen ist es vorzuziehen, STRING als Datentyp für Partitionsschlüssel zu verwenden. Obwohl Athena Partitionswerte im Format YYYY-MM-DD als Datum erkennt, wenn Sie den DATE-Typ verwenden, kann dies zu einer schlechten Leistung führen. Aus diesem Grund empfehlen wir, stattdessen den STRING-Datentyp für Partitionsschlüssel zu verwenden.

Wie Sie Abfragen für Zeitstempelfelder schreiben, die ebenfalls zeitpartitioniert sind

Wie Sie Abfragen für Zeitstempelfelder schreiben, die zeitpartitioniert sind, hängt vom Tabellentyp ab, den Sie abfragen möchten.

Hive-Tabellen

Bei den Hive-Tabellen, die in Athena am häufigsten verwendet werden, hat die Abfrage-Engine keine Kenntnis von den Beziehungen zwischen Spalten und Partitionsschlüsseln. Aus diesem Grund müssen Sie Ihren Abfragen immer Prädikate sowohl für die Spalte als auch für den Partitionsschlüssel hinzufügen.

Nehmen wir beispielsweise an, Sie haben eine event_time-Spalte und einen event_date-Partitionsschlüssel und möchten Ereignisse zwischen 23:00 und 03:00 Uhr abfragen. In diesem Fall müssen Sie Prädikate in Ihre Abfrage sowohl für die Spalte als auch für den Partitionsschlüssel aufnehmen, wie im folgenden Beispiel.

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

Iceberg-Tabellen

Bei Iceberg-Tabellen können Sie berechnete Partitionswerte verwenden, was Ihre Abfragen vereinfacht. Nehmen wir beispielsweise an, Ihre Iceberg-Tabelle wurde mit einer PARTITIONED BY-Klausel wie der folgenden erstellt:

PARTITIONED BY (event_date month(event_time))

In diesem Fall löscht die Abfrage-Engine automatisch Partitionen auf der Grundlage der Werte der event_time-Prädikate. Aus diesem Grund muss Ihre Abfrage nur ein Prädikat für event_time angeben, wie im folgenden Beispiel.

WHERE event_time BETWEEN start_time AND end_time

Weitere Informationen finden Sie unter Erstellen von Iceberg-Tabellen.