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.
Erfahren Sie mehr über 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
Obwohl Spark nicht zulässt, dass Datenbanken mit einer leeren Standorteigenschaft erstellt werden, können Datenbanken in AWS Glue 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: Kann keinen Pfad aus einer leeren Zeichenfolge erstellen.
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 AWS Glue, um der Datenbank, die Sie verwenden, einen Speicherort hinzuzufügen.
So fügen Sie einen Speicherort zu einer AWS Glue-Datenbank hinzu
Melden Sie sich bei der AWS-Managementkonsole an 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 SQL zum Erstellen der Tabelle verwenden, geben Sie einen Wert für location an, 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 AWS Glue nicht leer ist und einen gültigen Speicherort in Amazon S3 angibt und Sie Athena für Spark verwenden, um eine von Hive verwaltete Tabelle in Ihrer AWS Glue-Standarddatenbank zu erstellen, werden Daten in den Amazon-S3-Standort geschrieben, der in Ihrer Athena-Spark-Arbeitsgruppe angegeben ist, anstatt in den von der AWS Glue-Datenbank angegebenen Speicherort.
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 für Spark verwenden, um eine von Hive verwaltete Tabelle unter der Standarddatenbank in AWS Glue zu erstellen, 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-Anweisung wie
CREATE TABLE $tableName -
Ein PySpark-Befehl wie
df.write.mode("overwrite").saveAsTable($tableName)spezifiziert diepathOption in der DataFrame-API 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 verwaltete Hive-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.
Inkompatibilität der CSV- und JSON-Dateiformate zwischen Athena für Spark und Athena SQL
Aufgrund eines bekannten Problems mit Open-Source-Spark ist die Tabelle, wenn Sie in Athena für Spark mit CSV- oder JSON-Daten 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 DataFrame
-API-Syntax: df.write.format('csv').saveAsTable($table_name)
Aufgrund des bekannten Problems mit Open Source Spark sind Abfragen von Athena SQL für die 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 unter HIVEFORMAT-TABELLE ERSTELLEN