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

如何在AWS Glue中将DataFrame转换为Dynamic Frame?

AWS Glue DataFrame转DynamicFrame的实现方法汇总

现有代码优化建议

你当前代码中调用fromDF的方式不规范,该方法是DynamicFrame类的静态方法,不需要用实例调用,优化后的标准写法如下:

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
from awsglue.dynamicframe import DynamicFrame

glueContext = GlueContext(SparkContext.getOrCreate())

# 从数据目录加载数据
students = glueContext.create_dynamic_frame.from_catalog(database="example_db", table_name="samp_csv")

# 转成DataFrame做转换
students_df = students.toDF()
students_transformed_df = students_df.withColumnRenamed("state","County")\
    .withColumnRenamed("capital","cap")\
    .drop("municipal","metropolitan")

# 标准方式转回DynamicFrame
students_trans = DynamicFrame.fromDF(students_transformed_df, glueContext, "students_trans")

# 写入S3
glueContext.write_dynamic_frame.from_options(frame = students_trans,
              connection_type = "s3",
              connection_options = {"path": "s3://kingb/target/"},
              format = "csv")

其他可选转换方案

除了上述官方最推荐的标准转换方法外,还有两种可替代的实现方式:

  • 方法1:通过RDD中转生成DynamicFrame
    适合需要对RDD做自定义底层处理的场景,步骤是先把DataFrame转成RDD,再通过GlueContext的RDD加载接口生成DynamicFrame:
# 转换后的DataFrame转RDD
students_rdd = students_transformed_df.rdd
# 从RDD生成DynamicFrame,可复用DataFrame原有schema
students_trans = glueContext.create_dynamic_frame.from_rdd(
    rdd=students_rdd,
    name="students_trans",
    schema=students_transformed_df.schema
)
  • 方法2:直接用Glue原生转换避免互转
    如果只是做改列名、删列这类简单转换,不需要转成PySpark DataFrame,直接用Glue自带的Transform算子操作DynamicFrame即可,避免互转开销,整体运行效率更高:
from awsglue.transforms import ApplyMapping, DropFields

# 直接修改列名,不需要转DF
students_rename = ApplyMapping.apply(
    frame=students,
    mappings=[
        ("state", "string", "County", "string"),
        ("capital", "string", "cap", "string"),
        # 其余需要保留的列按上述格式补充即可
        ("id", "int", "id", "int"),
        ("name", "string", "name", "string")
    ]
)

# 直接删除不需要的列
students_trans = DropFields.apply(frame=students_rename, paths=["municipal", "metropolitan"])

内容的提问来源于stack exchange,提问作者Abiodun Adeoye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:06