Spark - Spark DataFrame 中混合区分大小写,Spark SQL,and/or Databricks Table

Spark - Mixed case sensitivity in Spark DataFrame, Spark SQL, and/or Databricks Table

我有来自 SQL 服务器的数据,我需要在 Apache Spark (Databricks) 中进行操作。

在SQL服务器中,table的三个键列使用区分大小写的COLLATION选项,因此这些特定的列区分大小写,但[=25中的其他列=] 不是。这些列是来自供应商应用程序的简短字母数字标识符,我们必须能够在谓词和连接条件中以区分大小写的方式使用它们,同时能够以不区分大小写的方式使用其他列。

table 已导出为 CSV。

除了使用 lower 和 upper 函数之外,有没有办法在 DataFrame 中混合区分大小写和不区分大小写的列比较?我也可以将此 CSV 导入 Databricks Table,但它似乎没有在元数据级别为连接提供类似的排序规则选项。

谢谢。

Spark 中没有这样的选项2.x。

如果您需要为下游处理保留数据的大小写,但您还需要进行不区分大小写的比较,您有以下三种选择:

  1. 创建包含 upper/lower-case 投影的附加列的视图。如果您专门使用 SparkSQL,这是最佳选择。我不建议在持久数据中为不区分大小写的操作实现额外的列:额外的 I/O 成本可能会超过更改大小写的 CPU 成本。

  2. 如果您使用的是 Spark DSL,您可以创建抽象,使您的意图更清晰,而无需过多的额外输入,也无需创建新的 columns/views,例如,引入不区分大小写的 ( in)equality 和比较运算符(如果您使用的是 Scala)。

    df.where('x ciLT 'y) // ciLT is case-insensitive less than, as an example

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

如果您主要在 WHEREORDER/SORT BY 中使用不区分大小写的操作,则性能会非常好,因为数据行不会被加宽以进行处理。否则,列将在 Spark 的内部行中 "materialized",并且会有小的性能损失。

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