问题陈述/根本原因:我们正在使用AWS Glue将数据从生产PostGress数据库加载到AWS DataLake中。胶水在内部使用Spark作业来移动数据。但是,我们的ETL过程失败了,因为Spark只支持小写的表列名,不幸的是,我们所有的源PostGress表列名都在CamelCase中并用双引号引起来。
例如:PostGress数据库中我们的源表列名称为“ CreatedDate”。 Spark作业查询正在查找createddate,但由于找不到列名而失败。因此,火花作业查询需要精确地查找“ CreatedDate”,以便能够从PostGress DB中移动数据。这似乎是Spark(仅支持小写的表列名称)和PostGress(使用双引号创建的列名称在余下的生命中都必须双引号)的固有限制。
参考链接: https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html Are PostgreSQL column names case-sensitive?
评估的解决方案: 1.我们将无法将列名从CamelCase重命名为小写,因为这将需要在所有下游系统中进行更大的更改。 2.我们正在尝试重写/调整Glue的自动生成的Spark代码,以查看是否可以使它与双引号,非小写的源表列名一起使用。
以前有没有人遇到过这个问题,您是否尝试过调整自动生成的Spark代码以使其正常工作?
答案 0 :(得分:0)
解决方案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 dataframe,则可以设置conf:
spark_session.sql('set spark.sql.caseSensitive=true')
答案 1 :(得分: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:布尔=否, Transformation_ctx =“ applymapping1_” + self.source.table_name)
我遇到了两个问题