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

Posted

技术标签:

【中文标题】由于 ApplyMapping 不区分大小写,如何确定我需要哪些列?【英文标题】:How to determine what are the columns I need since ApplyMapping is'nt case sensitive? 【发布时间】:2019-09-11 21:28:30 【问题描述】:

我正在使用新的数据库模型更新 Pyspark 脚本,我在调用/更新列时遇到了一些问题,因为 PySpark 显然将所有列都设为大写,但是当我使用 ApplyMapping 时,它不区分大小写但是当我加入时(通过左)与另一个表是区分大小写的,我最终得到多个具有相同名称的列,但其中一个为大写,另一个为小写,我想使用 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.

【问题讨论】:

【参考方案1】:

您可以在 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')

【讨论】:

以上是关于由于 ApplyMapping 不区分大小写,如何确定我需要哪些列?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL如何设置大小写敏感

LINUX环境下对大小写敏感,如何解决

如何查看mysql表名字段是不是区分大小写

如何在不区分大小写的 MySQL 数据库上执行区分大小写的搜索?

mysql模糊查询区分大小写

如何设置MySQL中表的大小写区分