AWS Glue Spark作业无法支持带双引号的大写列名

时间:2019-09-25 07:20:02

标签: pyspark aws-glue aws-glue-data-catalog data-lake

问题陈述/根本原因:我们正在使用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代码以使其正常工作?

2 个答案:

答案 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)

我遇到了两个问题

  1. 我无法保存修改后的脚本
  2. 在运行脚本时,它告诉我工作流名称丢失