【问题标题】:Spark - Mixed case sensitivity in Spark DataFrame, Spark SQL, and/or Databricks TableSpark - Spark DataFrame、Spark SQL 和/或 Databricks 表中的混合区分大小写
【发布时间】:2019-02-07 07:02:36
【问题描述】:

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

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

表格已导出为 CSV。

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

谢谢。

【问题讨论】:

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

标签: apache-spark dataframe apache-spark-sql databricks


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2019-11-05
    • 2020-06-20
    • 2017-01-15
    相关资源
    最近更新 更多