【问题标题】:Apache Spark startsWith in SQL expressionApache Spark 在 SQL 表达式中开始
【发布时间】:2019-05-30 02:53:59
【问题描述】:

在 Apache Spark API 中,我可以使用 startsWith 函数来测试列的值:

myDataFrame.filter(col("columnName").startsWith("PREFIX"))

是否可以在 Spark SQL 表达式中做同样的事情,如果可以,您能举个例子吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    使用 regexp_replace,您可以在没有 UDF 的情况下获得相同的结果。看看这个

    scala> val df=Seq(("bPREFIX",1),("PREFIXb",2)).toDF("a","b")
    df: org.apache.spark.sql.DataFrame = [a: string, b: int]
    
    scala> df.show
    +-------+---+
    |      a|  b|
    +-------+---+
    |bPREFIX|  1|
    |PREFIXb|  2|
    +-------+---+
    
    
    scala> df.filter(regexp_replace('a,"""^PREFIX.*""","")==="").show
    +-------+---+
    |      a|  b|
    +-------+---+
    |PREFIXb|  2|
    +-------+---+
    
    
    scala>
    

    或使用 regexp_extract()

    scala> df.filter(regexp_extract('a,"""(^PREFIX)""",1)==="PREFIX").show
    +-------+---+
    |      a|  b|
    +-------+---+
    |PREFIXb|  2|
    +-------+---+
    
    
    scala>
    

    使用 instr() 函数

    scala> df.filter("instr(a,'PREFIX')=1").show
    +-------+---+
    |      a|  b|
    +-------+---+
    |PREFIXb|  2|
    +-------+---+
    
    
    scala>
    

    【讨论】:

      【解决方案2】:

      我发现以下解决方案适用于无需自定义 UDP 且开箱即用的 Spark SQL 查询,例如:

      CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1
      

      【讨论】:

        【解决方案3】:

        您可以创建一个 UDF 来执行此操作

        import org.apache.spark.sql.functions
        val startsWith = udf((columnValue: String) => columnValue.startsWith("PREFIX"))
        

        UDF 将接收该列并根据 PREFIX 对其进行检查,然后您可以按如下方式使用它:

        myDataFrame.filter(startsWith($"columnName"))
        

        如果你想要一个参数作为前缀,你可以使用lit

        val startsWith = udf((columnValue: String, prefix:String) => columnValue.startsWith(prefix))
        myDataFrame.filter(startsWith($"columnName", lit("PREFIX")))
        

        输入示例

        +-----------+------+
        |letter     |number|
        +-----------+------+
        |    PREFIXb|     1|
        |    bPREFIX|     2|
        +-----------+------+
        

        输出示例

        myDataFrame.filter(startsWith($"letter")).show
        +-----------+------+
        |letter     |number|
        +-----------+------+
        |    PREFIXb|     1|
        +-----------+------+
        

        【讨论】:

        • 参数化的例子应该使用lit(prefix)而不是lit("PREFIX")
        猜你喜欢
        • 1970-01-01
        • 2016-05-26
        • 2019-11-23
        • 1970-01-01
        • 2015-10-20
        • 2020-05-22
        • 2021-12-09
        • 2015-07-11
        • 1970-01-01
        相关资源
        最近更新 更多