68,000 文字というコードブロックサイズの制限を克服する - Amazon Athena

68,000 文字というコードブロックサイズの制限を克服する

Athena for Spark には、計算コードのブロックサイズの上限が 68,000 文字という既知の制限があります。この制限を超えるコードブロックで計算を実行すると、次のエラーメッセージが表示されることがあります。

「codeBlock」の「...」は制約を満たすことができませんでした。メンバーの長さは 68,000 以下である必要があります

このエラーは、Athena コンソールのノートブックエディターで以下の画像のように表示されます。

Athena ノートブックエディター上のコードブロックサイズのエラーメッセージ

次の例のように、AWS CLI を使用して大きなコードブロックが含まれる計算を実行した場合にも、同じエラーが発生する場合があります。

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

このコマンドでは、次のエラーメッセージが表示されます。

{LARGE_CODE_BLOCK}「codeBlock」の「...」は制約を満たすことができませんでした。メンバーの長さは 68,000 以下である必要があります

回避方法

この問題を回避するには、クエリや計算コードが含まれるファイルを 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)