Apache Spark startsWith 在 SQL 表达式中

ale*_*oid 6 scala apache-spark apache-spark-sql

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

myDataFrame.filter(col("columnName").startsWith("PREFIX"))
Run Code Online (Sandbox Code Playgroud)

是否可以在 Spark SQL 表达式中执行相同的操作,如果可以,请举例说明?

sta*_*106 7

使用 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>
Run Code Online (Sandbox Code Playgroud)

或使用 regexp_extract()

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


scala>
Run Code Online (Sandbox Code Playgroud)

使用 instr() 函数

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


scala>
Run Code Online (Sandbox Code Playgroud)


ale*_*oid 4

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

CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1
Run Code Online (Sandbox Code Playgroud)