【问题标题】:Spark SQL case insensitive filter for column conditions用于列条件的 Spark SQL 不区分大小写过滤器
【发布时间】:2022-03-11 04:08:44
【问题描述】:

如何使用 Spark SQL 过滤器作为不区分大小写的过滤器。

例如:

dataFrame.filter(dataFrame.col("vendor").equalTo("fortinet"));

只返回 'vendor' 列等于 'fortinet' 的行,但我想要 'vendor' 列等于 'fortinet''Fortinet''foRtinet' 或 ...

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    您可以使用不区分大小写的正则表达式:

    val df = sc.parallelize(Seq(
      (1L, "Fortinet"), (2L, "foRtinet"), (3L, "foo")
    )).toDF("k", "v")
    
    df.where($"v".rlike("(?i)^fortinet$")).show
    // +---+--------+
    // |  k|       v|
    // +---+--------+
    // |  1|Fortinet|
    // |  2|foRtinet|
    // +---+--------+
    

    或与lower / upper 简单相等:

    import org.apache.spark.sql.functions.{lower, upper}
    
    df.where(lower($"v") === "fortinet")
    // +---+--------+
    // |  k|       v|
    // +---+--------+
    // |  1|Fortinet|
    // |  2|foRtinet|
    // +---+--------+
    
    df.where(upper($"v") === "FORTINET")
    // +---+--------+
    // |  k|       v|
    // +---+--------+
    // |  1|Fortinet|
    // |  2|foRtinet|
    // +---+--------+
    

    对于简单的过滤器,我更喜欢rlike,尽管性能应该相似,但join 条件相等是更好的选择。详情请见How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion?

    【讨论】:

    • @zero3232 我的所有表都有这个问题。我的意思是我需要我的应用程序提供不区分大小写的结果。有什么解决方案可以让我获得类似 SQLServer 的结果(每次都忽略大小写)?
    • 对于 Pyspark lower 可通过 from pyspark.sql.functions import lower 获得。
    • 对于像我一样被 (?i) 混淆的未来观众,这是 Scala 正则表达式标志 (case-insensitivity in this instance) 的语法。
    【解决方案2】:

    尝试使用低/高字符串函数:

    dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))
    

    dataFrame.filter(upper(dataFrame.col("vendor")).equalTo("FORTINET"))
    

    【讨论】:

      【解决方案3】:

      另一种保存几组括号的替代方法:

      import pyspark.sql.functions as f
      
      df.filter(f.upper("vendor") == "FORTINET)
      

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 2016-03-15
        • 2015-01-06
        • 2013-08-07
        • 2023-04-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多