由于 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 不区分大小写,如何确定我需要哪些列?的主要内容,如果未能解决你的问题,请参考以下文章