AWS Glue Spark 任务不支持带双引号的大写列名称



问题陈述/根本原因:我们使用 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. 我无法保存编辑后的脚本
  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')

最新更新