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

Pyspark AWS Glue Spark作业无法支持带双引号的大写列名,pyspark,aws-glue,aws-glue-data-catalog,data-lake,Pyspark,Aws Glue,Aws Glue Data Catalog,Data Lake,问题陈述/根本原因:我们正在使用AWS Glue将生产PostGress DB中的数据加载到AWS DataLake中。Glue内部使用Spark作业移动数据。然而,我们的ETL过程失败了,因为Spark只支持小写的表列名,不幸的是,我们所有的源PostGress表列名都是CamelCase格式的,并用双引号括起来 例如:我们在PostGress数据库中的源表列名是“CreatedDate”。Spark作业查询正在查找createddate,但由于找不到列名而失败。因此,spark作业查询需要精

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

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

参考链接:

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


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

解决方案1:如果您使用的是scala和glue dynamic frame,则可以使用
applyMapping()
。区分大小写的
的默认值为true。检查

解决方案2:如果您在python中使用pyspark数据帧,则可以设置conf:

spark_session.sql('set spark.sql.caseSensitive=true')

Sandeep Fatangare谢谢你的建议

我是AWS胶水的新手,我不知道我做得是否正确。如果我错了,请指导我

我尝试通过导航到来编辑脚本

AWS粘合->作业并选择失败的作业脚本

在详细信息选项卡中,它显示位置“作业详细信息中提到的位置是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)
我面临两个问题

  • 我无法保存编辑过的脚本
  • 运行脚本时,它告诉我缺少工作流名称

  • 我查看你的代码。问题既不是火花也不是胶水。是雅典娜。问题出现在第行:
    self.source\u schema=self.glue\u client.get\u table()['table']['StorageDescriptor']['Columns']
    您试图从athana表中获取架构,而在athana中,列将始终是小写。请进一步检查,athena不能有任何特殊字符,除了uz(下划线)。您可能必须找到不同的位置来获取列详细信息,而不是athena表,或者必须在applyMapping()中将源列映射到dest列。