使用Glue转换S3中CSV文件并输出至另一S3桶的技术咨询
解决Glue直接转换S3 CSV并输出到另一个S3桶(无需数据库)的方案
我来帮你搞定这个问题!其实完全不需要依赖RDS或者其他数据库,用Glue ETL作业就能直接完成CSV的转换和跨S3桶的输出,而且绕开必须指定数据库的限制。咱们一步步来解决:
第一步:先解决爬虫未检测到Schema的问题(可选,直接用ETL脚本可跳过)
你的CSV用分号;作为分隔符,默认的Glue CSV分类器是用逗号的,这应该是爬虫没检测到Schema的核心原因。你可以:
- 打开Glue控制台 → 分类器 → 找到你创建的CSV分类器,编辑它
- 将分隔符设置为
;,保存后重新运行爬虫,这样就能正确识别CSV的Schema了
不过如果不想用爬虫,直接在ETL作业里手动定义或让Spark自动推断Schema反而更灵活,接下来重点说这个方案。
第二步:创建Glue ETL脚本作业(核心,无需数据库)
Glue的脚本模式完全允许你直接读写S3数据,不用依赖Glue Data Catalog的数据库。具体操作:
- 打开Glue控制台 → 作业 → 添加作业
- 选择Spark作为引擎,Python作为语言,配置好有权限访问源/目标S3桶的IAM角色
- 在脚本编辑器里替换成以下示例代码(根据你的需求调整路径和转换逻辑):
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 # 初始化Glue和Spark上下文 args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) # 读取源S3的CSV文件:指定分号分隔符,若文件有表头则设header=True source_df = spark.read.csv( "s3://你的源存储桶路径/目标文件.csv", sep=";", header=True, # 如果你的CSV没有表头,设为False并手动定义schema inferSchema=True # 让Spark自动推断字段类型,也可以手动指定schema更精准 ) # 这里添加你的转换逻辑:比如过滤数据、重命名列、处理缺失值等 # 示例:transformed_df = source_df.withColumnRenamed("旧列名", "新列名") # 输出到目标S3桶:设置写入模式(overwrite覆盖/append追加),指定分隔符和表头 source_df.write.mode("overwrite").csv( "s3://你的目标存储桶路径/输出目录/", sep=",", # 可以改成你需要的输出分隔符 header=True ) # 提交作业 job.commit()
第三步:配置与运行
- 确保你的Glue作业IAM角色拥有:
- 源S3桶的
s3:GetObject权限 - 目标S3桶的
s3:PutObject权限 - Glue作业执行的基础权限(比如
glue:*相关权限,按需最小化配置)
- 源S3桶的
- 保存脚本后运行作业,完成后去目标S3桶查看输出的CSV文件即可
补充:用可视化ETL也能实现(无需数据库)
如果你更习惯可视化操作:
- 创建可视化ETL作业
- 添加数据源 → 选择S3,直接指定源CSV的路径,设置格式为CSV,分隔符为
;,手动定义或自动推断Schema - 添加数据目标 → 选择S3,指定目标桶路径,设置输出格式为CSV,配置好分隔符、表头等参数
- 跳过“数据目录”相关的配置,直接运行作业即可
这样就完全绕开了必须指定数据库的要求,直接完成S3到S3的CSV转换。
内容的提问来源于stack exchange,提问作者Kumar Vivek
相关产品推荐
相关产品推荐

