2

问题陈述/根本原因:我们正在使用 AWS Glue 将数据从生产 PostGress DB 加载到 AWS DataLake。Glue 在内部使用 Spark 作业来移动数据。然而,我们的 ETL 过程失败了,因为 Spark 只支持小写的表列名,不幸的是,我们所有的源 PostGress 表列名都采用 CamelCase 格式并用双引号括起来。

例如:我们在 PostGress DB 中的 Source 表列名称是“CreatedDate”。Spark 作业查询正在查找 createddate,但由于找不到列名而失败。因此,火花作业查询需要准确查找“CreatedDate”才能从 PostGress DB 中移动数据。这似乎是 Spark(因为它只支持小写的表列名)和 PostGress(使用双引号创建的列名在其余生中必须双引号)的固有限制。

参考链接: https : //docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html PostgreSQL 列名是否区分大小写?

评估的解决方案: 1. 我们将无法将列名从 CamelCase 重命名为小写,因为这将需要对所有下游系统进行更大的更改。2. 我们正在尝试重写/调整 Glue 的自动生成的 Spark 代码,看看我们是否可以让它与双引号、非小写的源表列名一起工作。

以前有没有人遇到过这个问题,您是否尝试过调整自动生成的 Spark 代码以使其正常工作?

4

2 回答 2

0

解决方案1:如果您使用的是scala和glue动态框架,您可以使用applyMapping(). 默认值为caseSensitivetrue。检查https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-dynamicframe-class.html#glue-etl-scala-apis-glue-dynamicframe-class-defs -应用映射

解决方案2:如果你在python中使用pyspark dataframe,你可以设置conf:

spark_session.sql('set spark.sql.caseSensitive=true')
于 2019-09-25T14:50:15.970 回答
0

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)

我遇到了两个问题

  1. 我无法保存编辑后的脚本
  2. 在运行脚本时它告诉我工作流名称丢失
于 2019-09-26T08:16:37.213 回答