You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWS Glue Studio 4.0读取S3中含symlink清单的Delta 2.1.0表?

问题描述

使用AWS Glue Studio 4.0选择存储在S3中的Delta Lake 2.1.0表作为数据源,自动生成以下脚本:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
    
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
S3bucket_node1 = glueContext.create_dynamic_frame.from_catalog(
            database="tien_bronze_layer",
            table_name="dim_product_dt",
            transformation_ctx="S3bucket_node1",
        )
job.commit()

保存并运行作业后出现错误:

Error: An error occurred while calling o96.getDynamicFrame.
s3://tientest/Bronze_layer/dim_product_dt/_symlink_format_manifest/manifest is not a Parquet file. Expected magic number at tail, but found [117, 101, 116, 10]

解决方案

这个错误是因为Glue默认将Delta表的_symlink_format_manifest目录下的文本清单文件误判为Parquet文件读取导致的,可通过以下方式解决:

  • 添加Delta Lake Spark配置
    在Glue作业的「作业参数」中新增以下配置项,让Spark识别Delta格式:

    --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension
    --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
    
  • 改用Delta专用读取逻辑
    替换自动生成的create_dynamic_frame.from_catalog代码,直接通过Spark读取Delta表再转为DynamicFrame:

    # 替换原S3bucket_node1的创建代码
    delta_df = spark.read.format("delta").load("s3://tientest/Bronze_layer/dim_product_dt/")
    S3bucket_node1 = DynamicFrame.fromDF(delta_df, glueContext, "S3bucket_node1")
    
  • 修正Glue Catalog表定义
    检查Glue Catalog中dim_product_dt表的输入格式,确保设置为delta而非parquet,同时表的位置需指向Delta表的根目录,不要指向_symlink_format_manifest目录。

内容的提问来源于stack exchange,提问作者Tien Vu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:02:03