apache-spark - Spark - Spark DataFrame、Spark SQL 和/或 Databricks 表中的混合区分大小写

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

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

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

该表已导出为 CSV。

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

谢谢你。

最佳答案

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

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

  • 创建具有大写/小写投影的附加列的 View 。如果您只使用 SparkSQL,这是最好的选择。我不建议为持久数据中不区分大小写的操作实现额外的列:额外的 I/O 成本可能会超过更改大小写的 CPU 成本。
  • 如果您使用的是 Spark DSL,您可以创建抽象,使您的意图更清晰,而无需过多的额外输入,也无需创建新的列/ View ,例如,如果您使用的是 Scala,则引入不区分大小写的(不)等式和比较运算符。
    df.where('x ciLT 'y) // ciLT is case-insensitive less than, as an example
  • 根据您必须编写多少代码、哪些操作需要不区分大小写的排序规则以及您使用的语言,您可以变得非常花哨,例如,自动重写表达式,使(不)等式和比较运算符的行为区分大小写或基于表名的不敏感方式。这需要对 Spark 的内部结构有深入的了解,并且只有在您必须以高代码速度管理大型代码库时才有意义。

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

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

    关于apache-spark - Spark - Spark DataFrame、Spark SQL 和/或 Databricks 表中的混合区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52129127/

    相关文章:

    apache-spark - 如何将 Dataset<Row> 列转换为非原始数据类型

    python - pandas dataframe 中的 iloc 函数用法

    python - 比较两个数据帧 Pyspark

    scala - Spark DataFrame 将 struct<.. 包装到 struct<. 的数组中

    python - 如何将spark rdd转换为numpy数组?

    amazon-web-services - Spark - Redshift -s3 : class path conflict

    apache-spark - (Zeppelin + Livy)SparkUI.appUIAddress(),一定有问题

    r - 从另一个包含基于列的分层分类法的数据框架创建一个数据框架

    r - 根据规则用其他值替换数据框中的值

    pyspark - 我想将数据框中的一列月份数字更改为月份名称(pyspark)