68,000 というコードブロックサイズの制限に対処する
Athena for Spark には、計算コードのブロックサイズの上限が 68,000 文字という既知の制限があります。この制限を超えるコードブロックで計算を実行すると、次のエラーメッセージが表示されることがあります。
「codeBlock」の「...」は制約を満たすことができませんでした。メンバーの長さは 68,000 以下である必要があります
このエラーは、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)