由于 ApplyMapping 不区分大小写,如何确定我需要哪些列?

How to determine what are the columns I need since ApplyMapping is'nt case sensitive?

我正在用新的数据库模型更新 Pyspark 脚本,我遇到了一些问题 calling/updating 列,因为 PySpark 显然将所有列都大写,但是当我使用 ApplyMapping 时它不区分大小写但是当我加入(左)与另一个 table 它区分大小写,我最终得到多个名称相同的列,但其中一个是大写,另一个是小写,我想使用 SelectFields 函数。

我试过使用完全相同的列名(区分大小写),但结果总是一样。

我试过打印模式,但唯一的区别只是大小写。

testDF = testDF.join(test2DF, "COLUMN",how='left')

test3DF=test3DF.withColumn("column", test3DF['ATTRB'].substr(4,4))

fullDF= testDF.join(test3DF, (testDF['ID'] == test3DF['ID']) )

.....

applymappingTest = ApplyMapping.apply(frame = fullDF, mappings = [
    ('ID', 'string', 'identifier', 'string')
    ('column', 'string', 'myColumn', 'string')
    ('COLUMN', 'string', 'someother', 'string')
    ], transformation_ctx = "applymappingTest")

......

selectfieldsTest= SelectFields.apply(frame = applymappingTest, paths = [
     "identifier",
     "myColumn",
], transformation_ctx = "selectfieldsTest")
Expected result:
myColumn is the column with the name in lowercase.
Actual result: 
myColumn is the column with the name in uppercase.

您可以在applymapping中设置caseSensitive选项。

def applyMapping( mappings : Seq[Product4[String, String, String, String]], caseSensitive : Boolean = true, transformationContext : String = "", callSite : CallSite = CallSite("Not provided", ""), stageThreshold : Long = 0, totalThreshold : Long = 0 ) : DynamicFrame 

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

顺便说一句,如果我没记错的话,applyMapping 默认是区分大小写的。但是 spark SQL 默认不区分大小写。要在 spark SQL 中设置区分大小写,您可以使用: spark_session.sql('set spark.sql.caseSensitive=true')