如何为读取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
相关产品推荐
相关产品推荐

