我有来自SQL Server的数据,需要在Apache Spark(Databricks)中进行处理。
在SQL Server中,此表的三个键列使用区分大小写的COLLATION选项,因此这些特定的列区分大小写,而表中的其他列则不区分大小写。这些列是供应商应用程序中简短的字母数字标识符,我们必须能够在谓词和联接条件中以区分大小写的方式使用它们,同时能够以不区分大小写的方式使用其他列。
该表已导出为CSV。
除了使用上下函数之外,是否有一种方法可以在DataFrame中混合区分大小写和不区分大小写的列比较?我也可以将此CSV导入到Databricks表中,但是在联接的元数据级别上似乎没有提供类似的排序规则选项。
谢谢。
答案 0 :(得分:1)
Spark 2.x中没有此类选项。
如果您需要保留数据的大小写以用于下游处理,但是还需要不区分大小写的比较,则可以使用以下三种选择:
创建带有其他列的视图,这些列是大写/小写投影。如果您仅使用SparkSQL,这是最佳选择。我不建议在持久化数据中为不区分大小写的操作增加额外的列:由于更改大小写,额外的I / O成本可能会超过CPU成本。
如果您正在使用Spark DSL,则可以创建抽象,使您的意图更加清晰,而无需进行过多的键入操作,而不必创建新的列/视图,例如,引入不区分大小写的(不区分大小写的)等号和比较运算符如果您使用的是Scala。
df.where('x ciLT 'y) // ciLT is case-insensitive less than, as an example
取决于您必须编写多少代码,哪些操作需要不区分大小写的排序规则以及所使用的语言,您可能会很喜欢,例如,自动重写表达式,以使(不等式)和比较运算符根据表名以区分大小写或不区分大小写的方式运行。这需要对Spark内部结构有深入的了解,并且只有在您必须以高代码速度管理大型代码库时才有意义。
如果您主要在WHERE
和ORDER/SORT BY
中使用不区分大小写的操作,则性能将非常好,因为不会扩大数据行的处理范围。否则,这些列将在Spark的内部行中“物化”,并且会降低性能。
如果您不需要保留数据的大小写以进行下游处理,则在提取过程中切换到普通大小写表示法是正确的方法。