克服 68k 程式碼區塊大小限制 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

克服 68k 程式碼區塊大小限制

Athena for Spark 的已知計算程式碼區塊大小限制為 68000 個字元。當您使用超過此限制的程式碼區塊執行計算時,您可能會收到下列錯誤訊息:

'...' at codeBlock '無法滿足限制:成員的長度必須小於或等於 68000

下圖顯示了 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' 無法滿足限制條件:成員的長度必須小於或等於 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)