Como superar o limite de tamanho do bloco de código de 68 mil - Amazon Athena

Como superar o limite de tamanho do bloco de código de 68 mil

O Athena para Spark tem um limite de tamanho de bloco de código de cálculo conhecido de 68 mil caracteres. Ao executar um cálculo com um bloco de código acima desse limite, você poderá receber a seguinte mensagem de erro:

“…” em “codeBlock” não atende à restrição: o tamanho do membro deve ser menor ou igual a 68.000

A imagem a seguir mostra esse erro no editor de caderno do console do Athena.

Mensagem de erro sobre o tamanho do bloco de código no editor de caderno do Athena

O mesmo erro pode ocorrer quando você usa a AWS CLI para executar um cálculo que tenha um bloco de código grande, como no exemplo a seguir.

aws athena start-calculation-execution \ --session-id "{SESSION_ID}" \ --description "{SESSION_DESCRIPTION}" \ --code-block "{LARGE_CODE_BLOCK}"

O comando apresenta a seguinte mensagem de erro:

{LARGE_CODE_BLOCK} em “codeBlock” não atende à restrição: o tamanho do membro deve ser menor ou igual a 68.000

Solução temporária

Para resolver esse problema, carregue o arquivo que contém a consulta ou o código do cálculo para o Amazon S3. Em seguida, use o boto3 para ler o arquivo e executar o SQL ou código.

Os exemplos a seguir pressupõem que você já carregou o arquivo que contém a consulta SQL ou o código Python no Amazon S3.

Exemplo de SQL

O código de exemplo a seguir lê o arquivo large_sql_query.sql em um bucket do Amazon S3 e executa a consulta grande que o arquivo contém.

s3 = boto3.resource('s3') def read_s3_content(bucket_name, key): response = s3.Object(bucket_name, key).get() return response['Body'].read() # SQL sql = read_s3_content('bucket_name', 'large_sql_query.sql') df = spark.sql(sql)

Exemplo do PySpark

O código de exemplo a seguir lê o arquivo large_py_spark.py no Amazon S3 e executa o bloco de código grande que está no arquivo.

s3 = boto3.resource('s3') def read_s3_content(bucket_name, key): response = s3.Object(bucket_name, key).get() return response['Body'].read() # PySpark py_spark_code = read_s3_content('bucket_name', 'large_py_spark.py') exec(py_spark_code)