Ottieni informazioni sui problemi noti in Athena per Spark.
Questa pagina documenta alcuni dei problemi noti di Athena per Apache Spark.
Eccezione di argomento illegale durante la creazione di una tabella
Sebbene Spark non consenta la creazione di database con una proprietà di posizione vuota, i database in AWS Glue possono avere una proprietà LOCATION vuota se vengono creati all'esterno di Spark.
Se si crea una tabella e si specifica un database AWS Glue con un campo LOCATION vuoto, può verificarsi un'eccezione come la seguente: IllegalArgumentException: Cannot create a path from an empty string (Eccezione argomento illegale: impossibile creare un percorso da una stringa vuota).
Ad esempio, il comando seguente genera un'eccezione se il database predefinito in AWS Glue contiene un campo LOCATION vuoto:
spark.sql("create table testTable (firstName STRING)")
Soluzione consigliata A: utilizza AWS Glue per aggiungere una posizione al database in uso.
Aggiunta di una posizione a un database AWS Glue
Accedere alla Console di gestione AWS, quindi aprire la console AWS Glue all'indirizzo https://console.aws.amazon.com/glue/
. -
Nel pannello di navigazione, seleziona Database.
-
Nell'elenco dei database, scegli il nome del database da modificare.
-
Nella pagina dei dettagli per il database, scegli Edit (Modifica).
-
Nella pagina Update a database (Aggiorna un database), in Location (Posizione), inserisci una posizione Amazon S3.
-
Scegli Update Database (Aggiorna database).
Soluzione consigliata B: utilizza un database AWS Glue diverso con una posizione esistente e valida in Amazon S3. Ad esempio, se hai un database denominato dbWithLocation, utilizza il comando spark.sql("use
dbWithLocation") per passare a quel database.
Soluzione consigliata C: quando utilizzi Spark SQL per creare la tabella, specifica un valore per location, come nell'esempio seguente.
spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket/'").
Soluzione consigliata D: se hai specificato una posizione quando hai creato la tabella ma il problema persiste, assicurati che il percorso Amazon S3 fornito abbia una barra finale. Ad esempio, il comando seguente genera un'eccezione di argomento illegale:
spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket'")
Per correggere questo problema, aggiungi una barra finale alla posizione (ad esempio, 's3://amzn-s3-demo-bucket/').
Database creato in una posizione del gruppo di lavoro
Se si utilizza un comando come spark.sql('create database db') per creare un database e non si specifica una posizione per il database, Athena crea una sottodirectory nella posizione del gruppo di lavoro e la utilizza per il database appena creato.
Problemi con le tabelle gestite da Hive nel database AWS Glue predefinito
Se la proprietà Location del database predefinito in AWS Glue non è vuota e specifica un percorso valido in Amazon S3 e utilizzi Athena per Spark per creare una tabella gestita Hive nel database AWS Glue predefinito, i dati vengono scritti nel percorso Amazon S3 specificato nel gruppo di lavoro Athena Spark anziché nella posizione specificata dal database AWS Glue.
Questo problema si verifica a causa del modo in cui Apache Hive gestisce il database predefinito. Apache Hive crea dati di tabella nella posizione principale del magazzino Hive, che può essere diversa dall'effettiva posizione predefinita del database.
Quando usi Athena per Spark per creare una tabella gestita Hive nel database predefinito in AWS Glue, i metadati della tabella AWS Glue possono puntare a due posizioni diverse. Ciò può causare un comportamento imprevisto quando si tenta un'operazione INSERT o DROP TABLE.
I passaggi per riprodurre il problema sono i seguenti:
-
In Athena for Spark, usi uno dei seguenti metodi per creare o salvare una tabella gestita da Hive:
-
Un'istruzione SQL come
CREATE TABLE $tableName -
Un comando PySpark come
df.write.mode("overwrite").saveAsTable($tableName)non specifica l'opzionepathnell'API Dataframe.
A questo punto, la console AWS Glue potrebbe mostrare una posizione errata in Amazon S3 per la tabella.
-
-
In Athena per Spark, utilizza l'istruzione
DROP TABLE $table_nameper eliminare la tabella che hai creato. -
Dopo aver eseguito l'istruzione
DROP TABLE, noterai che i file sottostanti in Amazon S3 sono ancora presenti.
Per risolvere il problema, procedi in uno dei seguenti modi:
Soluzione A: utilizza un database AWS Glue diverso quando crei tabelle gestite da Hive.
Soluzione B: specifica un percorso vuoto per il database predefinito in AWS Glue. Quindi, create le tabelle gestite nel database predefinito.
Incompatibilità dei formati di file CSV e JSON tra Athena for Spark e Athena SQL
A causa di un problema noto con Spark open source, quando crei una tabella in Athena per Spark su dati CSV o JSON, la tabella potrebbe non essere leggibile da Athena SQL e viceversa.
Ad esempio, è possibile creare una tabella in Athena per Spark in uno dei seguenti modi:
-
Con la seguente sintassi
USING csv:spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''') -
Con la seguente sintassi API DataFrame
: df.write.format('csv').saveAsTable($table_name)
A causa del problema noto con Spark open source, le query di Athena SQL sulle tabelle risultanti potrebbero non avere esito positivo.
Soluzione consigliata: prova a creare la tabella in Athena per Spark usando la sintassi Apache Hive. Per ulteriori informazioni, consulta CREATE HIVEFORMAT TABLE