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.
Bekannte Probleme in Athena für Spark
Diese Seite dokumentiert einige der bekannten Probleme in Athena für Apache Spark.
Unzulässige Argumentausnahme beim Erstellen einer Tabelle
Spark erlaubt zwar nicht, Datenbanken mit einer leeren Standorteigenschaft zu erstellen, aber Datenbanken in AWS Glue können eine leere LOCATION
Eigenschaft haben, wenn sie außerhalb von Spark erstellt werden.
Wenn Sie eine Tabelle erstellen und eine AWS Glue Datenbank mit einem leeren LOCATION
Feld angeben, kann eine Ausnahme wie die folgende auftreten IllegalArgumentException: Aus einer leeren Zeichenfolge kann kein Pfad erstellt werden.
Der folgende Befehl löst beispielsweise eine Ausnahme aus, wenn die Standarddatenbank in AWS Glue ein leeres LOCATION
-Feld enthält:
spark.sql("create table testTable (firstName STRING)")
Lösungsvorschlag A — Verwenden Sie diese AWS Glue Option, um der Datenbank, die Sie verwenden, einen Speicherort hinzuzufügen.
Um einer AWS Glue Datenbank einen Standort hinzuzufügen
Melden Sie sich bei der an AWS Management Console und öffnen Sie die AWS Glue Konsole unter https://console.aws.amazon.com/glue/
. -
Wählen Sie im Navigationsbereich Datenbanken aus.
-
Wählen Sie in der Liste der Datenbanken die Datenbank aus, die Sie bearbeiten möchten.
-
Wählen Sie auf der Detailseite für die Datenbank Edit (Bearbeiten) aus.
-
Geben Sie auf der Seite Update a database (Datenbank aktualisieren) für Location (Speicherort) einen Amazon-S3-Speicherort ein.
-
Wählen Sie Update Database (Datenbank aktualisieren) aus.
Lösungsvorschlag B – Verwenden Sie eine andere AWS Glue
-Datenbank, die über einen vorhandenen, gültigen Speicherort in Amazon S3 verfügt. Wenn Sie beispielsweise eine Datenbank mit dem Namen dbWithLocation
haben, verwenden Sie den Befehl spark.sql("use
dbWithLocation")
, um zu dieser Datenbank zu wechseln.
Lösungsvorschlag C — Wenn Sie Spark verwenden, SQL um die Tabelle zu erstellen, geben Sie einen Wert für anlocation
, wie im folgenden Beispiel.
spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket/'").
Lösungsvorschlag D – Wenn Sie bei der Erstellung der Tabelle einen Speicherort angegeben haben, das Problem jedoch weiterhin auftritt, stellen Sie sicher, dass der von Ihnen angegebene Amazon-S3-Pfad einen abschließenden Schrägstrich enthält. Der folgende Befehl löst beispielsweise eine Ausnahme für ein unzulässiges Argument aus:
spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket'")
Um dies zu korrigieren, fügen Sie dem Speicherort einen abschließenden Schrägstrich hinzu (z. B. 's3://
amzn-s3-demo-bucket/'
).
An einem Arbeitsgruppenspeicherort erstellte Datenbank
Wenn Sie einen Befehl wie spark.sql('create database db')
zum Erstellen einer Datenbank verwenden und keinen Speicherort für die Datenbank angeben, erstellt Athena ein Unterverzeichnis in Ihrem Arbeitsgruppenverzeichnis und verwendet diesen Speicherort für die neu erstellte Datenbank.
Probleme mit von Hive verwalteten Tabellen in der AWS Glue Standarddatenbank
Wenn die Location
Eigenschaft Ihrer Standarddatenbank in nicht leer AWS Glue ist und einen gültigen Speicherort in Amazon S3 angibt und Sie Athena for Spark verwenden, um eine von Hive verwaltete Tabelle in Ihrer AWS Glue Standarddatenbank zu erstellen, werden Daten in den Amazon S3 S3-Standort geschrieben, der in Ihrer Athena Spark-Arbeitsgruppe angegeben ist, anstatt in den von der Datenbank angegebenen Speicherort. AWS Glue
Dieses Problem tritt aufgrund der Art und Weise auf, wie Apache Hive seine Standarddatenbank behandelt. Apache Hive erstellt Tabellendaten im Stammverzeichnis des Hive-Warehouses, das sich vom tatsächlichen Standardspeicherort der Datenbank unterscheiden kann.
Wenn Sie Athena for Spark verwenden, um eine von Hive verwaltete Tabelle unter der Standarddatenbank in zu erstellen AWS Glue, können die AWS Glue Tabellenmetadaten auf zwei verschiedene Speicherorte verweisen. Dies kann zu unerwartetem Verhalten führen, wenn Sie versuchen, einen INSERT
- oder DROP TABLE
-Vorgang durchzuführen.
Gehen Sie wie folgt vor, um das Problem zu reproduzieren:
-
In Athena für Spark verwenden Sie eine der folgenden Methoden zum Erstellen oder Speichern einer verwalteten Hive-Tabelle:
-
Eine SQL Aussage wie
CREATE TABLE $tableName
-
Ein PySpark solcher
df.write.mode("overwrite").saveAsTable($tableName)
Befehl spezifiziert diepath
Option im API Dataframe nicht.
Zu diesem Zeitpunkt zeigt die AWS Glue Konsole möglicherweise einen falschen Speicherort für die Tabelle in Amazon S3 an.
-
-
In Athena für Spark verwenden Sie die
DROP TABLE $table_name
-Anweisung, um die von Ihnen erstellte Tabelle zu entfernen. -
Nachdem Sie die
DROP TABLE
-Anweisung ausgeführt haben, stellen Sie fest, dass die zugrunde liegenden Dateien in Amazon S3 immer noch vorhanden sind.
Sie lösen dieses Problem, indem Sie einen der folgenden Schritte ausführen:
Lösung A — Verwenden Sie eine andere AWS Glue Datenbank, wenn Sie von Hive verwaltete Tabellen erstellen.
Lösung B – Geben Sie einen leeren Speicherort für die Standarddatenbank in AWS Glue an. Erstellen Sie dann Ihre verwalteten Tabellen in der Standarddatenbank.
CSVund JSON Dateiformat-Inkompatibilität zwischen Athena for Spark und Athena SQL
Aufgrund eines bekannten Problems mit Open-Source-Spark ist die Tabelle, wenn Sie in Athena für Spark on CSV oder JSON data erstellen, möglicherweise nicht von Athena SQL aus lesbar und umgekehrt.
Für das Erstellen einer Tabelle in Athena für Spark steht Ihnen beispielsweise eine der folgenden Methoden zur Verfügung:
-
Mit der folgenden
USING csv
-Syntax:spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''')
-
Mit der folgenden Syntax: DataFrame
API df.write.format('csv').saveAsTable($table_name)
Aufgrund des bekannten Problems mit Open Source Spark sind Abfragen von Athena SQL an den resultierenden Tabellen möglicherweise nicht erfolgreich.
Lösungsvorschlag – Versuchen Sie, die Tabelle in Athena für Spark mit der Apache-Hive-Syntax zu erstellen. Weitere Informationen finden Sie CREATEHIVEFORMATTABLE