问题陈述/根本原因:我们使用 AWS Glue 将数据从生产 PostGress DB 加载到 AWS DataLake。Glue 在内部使用 Spark 作业来移动数据。然而,我们的 ETL 过程失败了,因为 Spark 只支持小写表列名,不幸的是,我们所有的源 PostGress 表列名都在 CamelCase 中并用双引号括起来。
例如:PostGress 数据库中的源表列名称是"CreatedDate"。Spark 作业查询正在查找创建日期,但由于找不到列名称而失败。因此,Spark 作业查询需要查找确切的"创建日期",以便能够从 PostGress 数据库移动数据。这似乎是 Spark(因为它只支持小写表列名(和 PostGress(用双引号创建的列名必须在余生中用双引号引起来(的固有限制。
参考链接: https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html PostgreSQL 列名是否区分大小写?
评估的解决方案: 1. 我们无法将列名从驼峰重命名为小写,因为这将需要对所有下游系统进行更大的更改。 2. 我们正在尝试重写/调整 Glue 自动生成的 Spark 代码,看看我们是否可以让它使用双引号、非小写的源表列名。
以前有没有人遇到过这个问题,您是否尝试过调整自动生成的 Spark 代码以使其正常工作?
Sandeep Fatangare感谢您的建议。
我是 AWS Glue 的新手,我不知道我做得是否正确。如果我错了,请指导我。
我尝试通过导航到
AWS Glue -> 作业并选择失败的作业脚本
在详细信息选项卡中,它显示位置"作业详细信息中提及的位置是 s3://aws-glue-assets-us-east-1/scripts/glueetl/jdbc_incremental.py"。
在脚本选项卡中,我开始编辑脚本
以前:
applymapping1 = ApplyMapping.apply(frame=datasource0, mappings=self.get_mappings(), transformation_ctx="applymapping1_" + self.source.table_name)
编辑:
applymapping1 = ApplyMapping.apply(frame=datasource0, mappings=self.get_mappings(),
caseSensitive : Boolean = false,
transformation_ctx="applymapping1_" + self.source.table_name)
我面临2个问题
- 我无法保存编辑后的脚本
- 在运行脚本时,它告诉我工作流名称丢失
解决方案 1:如果您使用的是 scala 和粘附动态帧,则可以使用applyMapping()
.caseSensitive
的默认值为 true。检查 https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-dynamicframe-class.html#glue-etl-scala-apis-glue-dynamicframe-class-defs-applyMapping
解决方案 2:如果你在 Python 中使用 pyspark 数据帧,你可以设置 conf:
spark_session.sql('set spark.sql.caseSensitive=true')