Saber mais sobre os problemas conhecidos do Athena para Spark - Amazon Athena

Saber mais sobre os problemas conhecidos do Athena para Spark

Essa página documenta alguns dos problemas conhecidos no Athena para Apache Spark.

Exceção para argumento inválido ao criar uma tabela

Embora o Spark não permita que bancos de dados sejam criados com uma propriedade de local vazia, os bancos de dados no AWS Glue podem ter uma propriedade LOCATION vazia se forem criados de forma externa ao Spark.

Se você criar uma tabela e especificar um banco de dados do AWS Glue com um campo LOCATION vazio, poderá ocorrer uma exceção como a seguinte: IllegalArgumentException: Cannot create a path from an empty string. (IllegalArgumentException: não é possível criar um caminho usando uma string vazia).

Por exemplo, o comando a seguir gera uma exceção se o banco de dados padrão no AWS Glue contiver um campo LOCATION vazio:

spark.sql("create table testTable (firstName STRING)")

Solução sugerida A: use o AWS Glue para adicionar um local ao banco de dados que você está usando.

Para adicionar um local a um banco de dados do AWS Glue
  1. Faça login no AWS Management Console e abra o console do AWS Glue em https://console.aws.amazon.com/glue/.

  2. No painel de navegação, escolha Bancos de dados.

  3. Na lista de bancos de dados, selecione o banco de dados que deseja editar.

  4. Na página de detalhes do banco de dados, escolha Edit (Editar).

  5. Na página Update a database (Atualizar um banco de dados), em Location (Local), insira um local do Amazon S3.

  6. Escolha Update Database (Atualizar banco de dados).

Solução sugerida B: use um banco de dados diferente do AWS Glue que tenha um local válido e existente no Amazon S3. Por exemplo, se você tiver um banco de dados denominado dbWithLocation, use o comando spark.sql("use dbWithLocation") para alternar para esse banco de dados.

Solução sugerida C: ao usar o Spark SQL para criar a tabela, especifique um valor para location, como no exemplo a seguir.

spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket/'").

Solução sugerida D: se você especificou um local ao criar a tabela, mas o problema persistir, certifique-se de que o caminho do Amazon S3 fornecido tenha uma barra no final. Por exemplo, o comando a seguir gera uma exceção para o argumento inválido:

spark.sql("create table testTable (firstName STRING) location 's3://amzn-s3-demo-bucket'")

Para corrigir isso, adicione uma barra no final para o local (por exemplo, 's3://amzn-s3-demo-bucket/').

Banco de dados criado em um local do grupo de trabalho

Se você usar um comando como spark.sql('create database db') para criar um banco de dados e não especificar um local para ele, o Athena criará um subdiretório no local do seu grupo de trabalho e usará esse local para o banco de dados recém-criado.

Problemas com tabelas gerenciadas pelo Hive no banco de dados do AWS Glue padrão

Se a propriedade Location de seu banco de dados padrão no AWS Glue não estiver vazia e especificar um local válido no Amazon S3, e você usar o Athena para Spark para criar uma tabela gerenciada pelo Hive em seu banco de dados do AWS Glue padrão, os dados serão gravados no local do Amazon S3 especificado no grupo de trabalho do Athena Spark, e não no local especificado pelo banco de dados do AWS Glue.

Esse problema ocorre devido à forma como o Apache Hive manipula o banco de dados padrão. O Apache Hive cria dados de tabela na localização raiz do warehouse Hive, que pode ser diferente da localização real do banco de dados padrão.

Quando você usa o Athena para Spark para criar uma tabela gerenciada pelo Hive no banco de dados padrão no AWS Glue, os metadados da tabela do AWS Glue podem apontar para dois locais diferentes. Isso pode causar um comportamento inesperado ao tentar uma operação INSERT ou DROP TABLE.

Estão são as etapas para reproduzir o problema:

  1. No Athena para Spark, você usa um dos seguintes métodos para criar ou salvar uma tabela gerenciada pelo Hive:

    • Uma instrução SQL como CREATE TABLE $tableName

    • Um comando PySpark como df.write.mode("overwrite").saveAsTable($tableName) que não especifica a opção path na API Dataframe.

    Nesse momento, o console do AWS Glue pode mostrar uma localização incorreta no Amazon S3 para a tabela.

  2. No Athena para Spark, use a instrução DROP TABLE $table_name para eliminar a tabela que você criou.

  3. Após executar a instrução DROP TABLE, você percebe que os arquivos subjacentes no Amazon S3 ainda estão presentes.

Para resolver esse problema, execute um dos seguintes procedimentos:

Solução A: use um banco de dados do AWS Glue diferente ao criar tabelas gerenciadas pelo Hive.

Solução B: especifique um local vazio para o banco de dados padrão no AWS Glue. Em seguida, crie as tabelas gerenciadas no banco de dados padrão.

Incompatibilidade de formatos de arquivo CSV e JSON entre o Athena para Spark e o Athena SQL

Devido a um problema conhecido com o Spark de código aberto, ao criar uma tabela no Athena para Spark em dados CSV ou JSON, a tabela pode não ser legível no Athena SQL e vice-versa.

Por exemplo, é possível criar uma tabela no Athena para Spark das seguintes maneiras:

  • Com esta seguinte sintaxe USING csv:

    spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''')
  • Com a seguinte sintaxe da API DataFrame:

    df.write.format('csv').saveAsTable($table_name)

Devido ao problema conhecido com o Spark de código aberto, as consultas do Athena SQL nas tabelas resultantes podem não ser bem-sucedidas.

Solução sugerida: tente criar a tabela no Athena para Spark usando a sintaxe do Apache Hive. Para obter mais informações, consulte CREATE HIVEFORMAT TABLE na documentação do Apache Spark.