AWS Glue Notebook数组转文本及Athena PathNo空值问题求助
解决AWS Glue爬虫生成表后Athena中PathNo字段为空+类型设置问题
一、搞定PathNo字段空值问题
空值大概率是Glue爬虫自动推断的字段类型和CSV里PathNo的实际格式不匹配导致的——比如爬虫把它识别成了数值类型,但字段里有非数字字符、前后空格,或者值的格式不符合数值要求,Athena查询时直接解析失败显示为空。给你几个可行方案:
1. 直接修改Glue表结构(快速救急)
- 进入Glue数据目录找到Flights表,编辑表结构
- 把PathNo的类型改成
string,保存后再去Athena查询,基本就能解决空值问题
2. 用Glue ETL脚本从源头规范数据(长期稳定方案)
如果要从根本上避免类型推断错误,写个Glue ETL脚本重新处理CSV,强制指定PathNo为string类型:
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 args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) # 读取你的CSV数据源,替换成实际S3路径 raw_data = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://your-bucket/flights-data/"]}, format="csv", format_options={ "withHeader": True, "separator": "," # 匹配你的CSV分隔符,比如分号就改";" } ) # 映射字段时强制指定PathNo为string,其他字段按实际情况调整 mapped_data = ApplyMapping.apply( frame=raw_data, mappings=[ ("PathNo", "string", "PathNo", "string"), ("FlightDate", "string", "FlightDate", "string"), ("DepartureTime", "int", "DepartureTime", "int") # 其他字段依次添加 ] ) # 写入处理后的数据到S3,同时更新Glue表 glueContext.write_dynamic_frame.from_catalog( frame=mapped_data, database="your-glue-db", table_name="Flights", transformation_ctx="write_output" ) job.commit()
3. 给爬虫配自定义分类器(避免后续爬错)
创建自定义CSV分类器,提前指定字段类型,不让爬虫瞎猜:
- 进入Glue控制台的「分类器」页面,新建CSV分类器
- 勾选「有表头」,设置好分隔符,在「列定义」里手动把PathNo设为
string - 爬取Flights表时用这个自定义分类器,替代默认的自动推断
二、把PathNo设为string(替代Text)
Athena用的是Hive元数据体系,确实没有text类型,string类型完全能满足你导出文本的需求——上面所有方案里指定PathNo为string的操作,就是在做这件事,设置后Athena会把该字段当成纯文本处理。
额外排查点
- 检查CSV里的PathNo有没有隐藏字符(比如换行、制表符),可以用文本编辑器打开看,或者在ETL脚本里加个清理逻辑:
from pyspark.sql.functions import trim from awsglue.dynamicframe import DynamicFrame # 转成DataFrame清理空格,再转回DynamicFrame df = raw_data.toDF() clean_df = df.withColumn("PathNo", trim(df["PathNo"])) clean_dynamic_frame = DynamicFrame.fromDF(clean_df, glueContext, "clean_df")
- 确认Glue表的位置是不是指向了你有数据的CSV文件,别爬错了旧的空文件
内容的提问来源于stack exchange,提问作者Harris Yale
相关产品推荐
相关产品推荐

