绕过 68k 代码块大小限制 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

绕过 68k 代码块大小限制

Athena for Spark 的已知计算代码块大小限制为 68000 个字符。当您运行代码块超过此限制的计算时,可能会收到以下错误消息:

“codeBlock”中的“...”无法满足约束条件:成员长度必须小于或等于 68000

下图显示了 Athena 控制台笔记本编辑器中的此错误。

Athena 笔记本编辑器中的代码块大小错误消息

当您使用 Amazon CLI 运行包含大型代码块的计算时,可能会出现同样的错误,如以下示例所示。

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

该命令会给出以下错误消息:

“codeBlock”中的 {LARGE_CODE_BLOCK} 无法满足约束条件:成员长度必须小于或等于 68000

解决办法

要解决此问题,将包含您的查询或计算代码的文件上传到 Amazon S3。然后,使用 boto3 读取文件并运行您的 SQL 或代码。

以下示例假设您已经将包含您的 SQL 查询或 Python 代码的文件上传到 Amazon S3。

SQL 示例

以下示例代码从 Amazon S3 存储桶读取 large_sql_query.sql 文件,然后运行该文件包含的大型查询。

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)

PySpark 示例

以下示例代码从 Amazon S3 读取 large_py_spark.py 文件,然后运行该文件包含的大型代码块。

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)