在AWS Glue任务中使用PySpark SQL无法插入数据至另一表(无报错)
排查AWS Glue PySpark插入数据无报错但未写入的问题
1. 表结构不匹配
- 检查
details_info和goals_info的字段名、数据类型、分区列是否完全一致- 执行以下语句对比表结构:
spark.sql("DESCRIBE details_info") spark.sql("DESCRIBE goals_info") - 若为分区表,需确认分区列的名称、类型定义完全相同,且插入的分区值符合目标表规则
- 执行以下语句对比表结构:
- 解决方式:同步表结构,或插入时显式指定字段并做类型转换,示例:
INSERT INTO goals_info (user_id, target, create_date) SELECT cast(user_id as string), target, create_date FROM details_info
2. 查询结果集为空
- 确认插入用的
SELECT语句实际返回数据,即使源表计数为50000,也可能因过滤条件导致无数据输出- 执行以下语句验证:
SELECT COUNT(*) FROM details_info -- 确认源数据量 SELECT COUNT(*) FROM [你的插入查询语句] -- 检查返回计数是否>0
- 执行以下语句验证:
- 解决方式:调整查询条件,确保有数据返回
3. Glue任务配置与事务问题
- 检查提交模式:若配置了特殊的提交协议(如
SQLHadoopMapReduceCommitProtocol),可能影响写入行为 - 若目标表是ACID事务表,需确认插入操作触发了事务提交
- 查看表属性:
spark.sql("SHOW TBLPROPERTIES goals_info")
- 查看表属性:
- 解决方式:若不需要事务,关闭目标表的
transactional属性;若需要事务,确保Glue任务的Spark配置支持事务提交
4. S3路径权限不足
- 检查
goals_info对应S3路径的权限:Glue执行角色需具备s3:PutObject、s3:ListBucket权限- 查看CloudWatch日志,搜索是否有隐藏的权限报错(部分权限问题不会直接抛出任务错误)
- 解决方式:给Glue执行角色添加对应S3路径的权限策略
5. insertInto写入模式问题
- 使用
write.insertInto()时,默认追加模式,但分区列数据不存在或模式配置错误可能导致无数据写入- 显式指定模式并查看执行日志:
df.write.mode("append").insertInto("goals_info") - 打开Glue任务的Spark UI,查看Stage的写入数据量是否为0
- 显式指定模式并查看执行日志:
- 解决方式:确认写入模式正确,可临时用
mode("overwrite")测试(注意备份数据),通过Spark UI定位执行细节
6. 存储格式兼容性问题
- 检查源表与目标表的存储格式(Parquet/ORC/CSV等)是否兼容,复杂类型(数组、结构体)可能无法写入某些格式但不报错
- 解决方式:统一存储格式,或插入时将复杂类型转换为目标格式支持的类型
内容的提问来源于stack exchange,提问作者user8545255
相关产品推荐
相关产品推荐

