Glue Crawler读取CSV时丢失前导零,如何解决?
解决Glue Crawler识别含前导零列丢失数据的问题
A) 避免前导零丢失
要保留SSNO列的前导零,核心是让该列被识别为字符串类型,可通过以下方式实现:
配置CSV分类器强制指定列类型
- 登录Glue控制台,创建或编辑一个CSV分类器
- 开启"Has header"(适配带表头的CSV),设置正确的分隔符(默认逗号)
- 在「Column type hints」中添加
SSNO: string,强制指定该列为字符串 - 将此分类器关联到目标Crawler,重新运行后,SSNO列会以字符串类型存入数据目录,前导零完全保留
手动修改数据表Schema
- 运行Crawler后,在Glue数据目录找到生成的目标表
- 进入表的「Schema」页面,点击「Edit schema」
- 将SSNO列的类型从
bigint修改为string并保存 - 后续读取该表时,SSNO会以字符串形式加载;若已有历史数据丢失前导零,需重新导入或通过Glue Job修复
B) 强制将SSNO列读取为字符串类型
除了修改Crawler配置,也可以在数据读取阶段直接强制指定类型:
Glue Job中自定义Schema读取CSV
直接在Spark代码里定义完整Schema,跳过Crawler的自动识别逻辑:from pyspark.sql.types import StructType, StructField, StringType, IntegerType # 根据你的CSV结构定义Schema,将SSNO设为StringType custom_schema = StructType([ StructField("user_id", IntegerType(), nullable=True), StructField("SSNO", StringType(), nullable=True), StructField("name", StringType(), nullable=True) # 按实际列顺序和类型补充其他字段 ]) # 读取S3上的CSV文件,使用自定义Schema df = spark.read.csv("s3://your-bucket/csv-path/", schema=custom_schema, header=True) # 将处理后的数据写入Glue数据目录 df.write.mode("overwrite").saveAsTable("your_db.your_table")用resolveChoice转换已识别错误的列
如果表已被错误识别为bigint,可在Glue Job中动态转换类型:from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) # 从数据目录读取错误类型的表 dynamic_frame = glueContext.create_dynamic_frame.from_catalog( database="your_db", table_name="error_table" ) # 强制将SSNO列转为字符串,恢复前导零 fixed_frame = dynamic_frame.resolveChoice( specs=[("SSNO", "cast:string")] ) # 将修复后的数据写入新表 glueContext.write_dynamic_frame.from_catalog( frame=fixed_frame, database="your_db", table_name="fixed_table" )
内容的提问来源于stack exchange,提问作者undetected
相关产品推荐
相关产品推荐

