Apache spark Spark-Spark DataFrame、Spark SQL和/或DataRicks表中的混合大小写敏感度

Apache spark Spark-Spark DataFrame、Spark SQL和/或DataRicks表中的混合大小写敏感度,apache-spark,dataframe,apache-spark-sql,databricks,Apache Spark,Dataframe,Apache Spark Sql,Databricks,我有来自SQL Server的数据,需要在ApacheSpark(Databricks)中进行操作 在SQL Server中,此表的三个键列使用区分大小写的排序规则选项,因此这些特定列区分大小写,而表中的其他列则不区分大小写。这些列是来自供应商应用程序的简短字母数字标识符,我们必须能够在谓词和连接条件中以区分大小写的方式使用它们,同时能够以不区分大小写的方式使用其他列 该表已导出为CSV 除了使用lower和upper函数外,是否还有一种方法可以在数据帧中混合区分大小写和不区分大小写的列比较?我

我有来自SQL Server的数据,需要在ApacheSpark(Databricks)中进行操作

在SQL Server中,此表的三个键列使用区分大小写的排序规则选项,因此这些特定列区分大小写,而表中的其他列则不区分大小写。这些列是来自供应商应用程序的简短字母数字标识符,我们必须能够在谓词和连接条件中以区分大小写的方式使用它们,同时能够以不区分大小写的方式使用其他列

该表已导出为CSV

除了使用lower和upper函数外,是否还有一种方法可以在数据帧中混合区分大小写和不区分大小写的列比较?我还可以将这个CSV导入到DataRicks表中,但这似乎并没有在元数据级别为联接提供类似的排序选项


谢谢。

Spark 2.x中没有此类选项

如果需要为下游处理保留数据的大小写,但也需要不区分大小写的比较,则有三个选项:

  • 创建具有大写/小写投影的附加列的视图。如果您专门使用SparkSQL,这是最好的选择。我不建议在持久化数据中为不区分大小写的操作具体化额外的列:额外的I/O成本可能会超过更改大小写的CPU成本

  • 如果您使用Spark DSL,您可以创建抽象,使您的意图更加清晰,而无需太多额外的键入,也无需创建新的列/视图,例如,如果您使用Scala,则引入不区分大小写(in)的相等运算符和比较运算符

    df.where('x ciLT'y)//ciLT不区分大小写,例如小于

  • 根据需要编写的代码数量、哪些操作需要区分大小写的排序规则以及所使用的语言,您可以获得非常好的效果,例如,自动重写表达式,使(in)相等运算符和比较运算符根据表名以区分大小写或不区分大小写的方式运行。这需要对Spark的内部结构有深入的了解,并且只有在您必须以高代码速度管理大型代码库时才有意义

  • 如果您主要在
    WHERE
    ORDER/SORT BY
    中使用不区分大小写的操作,那么性能将非常好,因为数据行不会被加宽以进行处理。否则,这些列将在Spark的内部行中“具体化”,并且会有一个小的性能损失


    如果您不需要为下游处理保留数据的大小写,那么在摄取期间切换到通用大小写表示是正确的方法。

    我认为没有这样的选项(除非您想使用regexp进行比较:
    col.rlike((?I)^VaLue$))
    。我想最有效的方法是使用大写值为每个不区分大小写的列创建副本,并根据它们进行比较。