Problemi noti in Athena per Spark - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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à location vuota, i database in AWS Glue possono avere una LOCATION proprietà vuota se vengono creati all'esterno di Spark.

Se crei una tabella e specifichi un AWS Glue database con un LOCATION campo vuoto, può verificarsi un'eccezione come la seguente IllegalArgumentException: 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 AWS Glue A: da utilizzare per aggiungere una posizione al database in uso.

Per aggiungere una posizione a un AWS Glue database
  1. Accedere AWS Management Console e aprire la AWS Glue console all'indirizzo https://console.aws.amazon.com/glue/.

  2. Nel riquadro di navigazione, scegli Databases (Database).

  3. Nell'elenco dei database, scegli il nome del database da modificare.

  4. Nella pagina dei dettagli per il database, scegli Edit (Modifica).

  5. Nella pagina Update a database (Aggiorna un database), in Location (Posizione), inserisci una posizione Amazon S3.

  6. 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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET'")

Per correggere questo problema, aggiungi una barra finale alla posizione (ad esempio, 's3:// DOC-EXAMPLE-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 Location proprietà del database predefinito in non AWS Glue è vuota e specifica una posizione valida in Amazon S3 e utilizzi Athena for Spark per creare una tabella gestita Hive nel database predefinito, AWS Glue i dati vengono scritti nella posizione Amazon S3 specificata 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 for Spark per creare una tabella gestita Hive nel database predefinito in AWS Glue, i metadati della AWS Glue tabella 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:

  1. 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 PySpark comando del df.write.mode("overwrite").saveAsTable($tableName) genere non specifica l'pathopzione nell'API Dataframe.

    A questo punto, la AWS Glue console potrebbe mostrare una posizione errata in Amazon S3 per la tabella.

  2. In Athena per Spark, utilizza l'istruzione DROP TABLE $table_name per eliminare la tabella che hai creato.

  3. 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 AWS Glue database 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 DataFrameAPI:

    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 nella documentazione di Apache Spark.