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

如何为读取Excel文件的AWS Glue Job运行Crawler同步数据目录?

核心问题说明

你的代码缺少数据持久化和元数据注册的必要逻辑,Crawler找不到目标位置是必然结果:

  • 当前代码仅在内存中完成了Excel读取、转Spark DataFrame、打印Schema的操作,作业执行完成后内存数据直接释放,没有把任何数据写入到S3存储,Crawler没有可扫描的数据源。
  • 现有写法用pandas读取S3上的Excel存在稳定性问题:pandas是单进程运行在Glue Driver节点,文件体积稍大就会触发OOM导致作业失败,Glue 2.0自带原生spark-excel连接器,支持分布式读取Excel,不需要依赖pandas做中转。
修正方案

补全数据写入S3、同步元数据的逻辑,两种方式可选:

方式1:写入时直接注册Data Catalog表(推荐,不需要跑Crawler)

直接在写入数据的时候同步表结构到Glue Data Catalog,作业跑完就能在Catalog里查到对应的表,省去Crawler运行的步骤,代码如下:

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 pyspark.sql.functions import col

args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# 替换为你实际的配置
output_s3_path = "s3://your-bucket/glue-output/employee_sheet1/"
catalog_db_name = "your_glue_database"
catalog_table_name = "employee"

# 原生Spark分布式读取Excel,指定工作表
input_df = spark.read.format("com.crealytics.spark.excel") \
    .option("header", "true") \
    .option("inferSchema", "false") \
    .option("sheetName", "Sheet1") \
    .load("s3://input/employee.xlsx")

# 保留你原有的全字段转字符串逻辑
input_df = input_df.select([col(column).cast("string").alias(column) for column in input_df.columns])
input_df.printSchema()

# 写入S3并自动注册Catalog表
input_df.write.mode("overwrite") \
    .format("parquet") \
    .option("path", output_s3_path) \
    .saveAsTable(f"{catalog_db_name}.{catalog_table_name}")

job.commit()

方式2:写入S3后用Crawler爬取元数据

如果你坚持使用Crawler做元数据扫描,按以下步骤调整:

  • 先在代码里补全数据写入S3的逻辑,把处理好的DataFrame写到你规划好的S3输出路径
  • 创建Crawler时,将爬取目标设置为你刚才写入的S3输出路径,不要指向原始Excel文件的存放路径(Crawler对单Excel文件的多Sheet识别支持很差,建议爬取处理后输出的列式格式文件)
  • 给Crawler绑定的IAM角色授予目标S3路径的读权限、Glue Data Catalog的建表权限
  • 等Glue作业完全运行结束、数据全部写入S3后再启动Crawler,即可成功识别Schema创建Catalog表
多工作表处理提示

如果需要读取同一个Excel里的多个工作表,只需要循环读取每个Sheet,给每个Sheet指定独立的S3输出路径和对应Catalog表即可,不要把多个Sheet的数据写入同一个S3路径,否则会出现Schema识别混乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:45:37