Superar el límite de tamaño para bloques de código de 68 000 - Amazon Athena

Superar el límite de tamaño para bloques de código de 68 000

Athena para Spark tiene un límite de tamaño para bloques de código de cálculo conocido de 68 000 caracteres. Cuando ejecuta un cálculo con un bloque de código por encima de este límite, puede recibir el siguiente mensaje de error:

“…” en “CodeBlock” no cumplió con la restricción: la longitud debe ser menor o igual a 68 000

La siguiente imagen muestra este error en el editor de cuadernos de la consola de Athena.

Mensaje de error de tamaño del bloque de código en el editor de cuadernos de Athena

El mismo error puede producirse cuando se utiliza la AWS CLI para ejecutar un cálculo que tiene un bloque de código grande, como en el siguiente ejemplo.

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

El comando muestra el siguiente mensaje de error:

{LARGE_CODE_BLOCK} at 'codeBlock' failed to satisfy constraint: Member must have length less than or equal to 68000 ({LARGE_CODE_BLOCK} en “codeBlock” no cumplió con la restricción: la longitud del miembro debe ser menor o igual a 68 000).

Solución

Para solucionar este problema, cargue el archivo que contiene su código de cálculo o consulta a Amazon S3. A continuación, utilice boto3 para leer el archivo y ejecutar el código o SQL.

En los siguientes ejemplos se supone que ya ha cargado el archivo que contiene la consulta SQL o el código Python en Amazon S3.

Ejemplo de SQL

El siguiente ejemplo de código lee el archivo large_sql_query.sql de un bucket de Amazon S3 y luego ejecuta la consulta grande que contiene el archivo.

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)

Ejemplo de PySpark

El siguiente ejemplo de código lee el archivo large_py_spark.py de Amazon S3 y luego ejecuta el bloque de código grande que se encuentra en el archivo.

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)