scala Apache Spark启动SQL表达式中的With

ycggw6v2  于 2022-11-29  发布在  Scala
关注(0)|答案(4)|浏览(204)

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

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

是否可以在Spark SQL表达式中做同样的事情?如果可以,请给出一个示例。

s8vozzvw

s8vozzvw1#

使用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>
i7uaboj4

i7uaboj42#

我发现下面的解决方案,工作与Spark SQL查询没有自定义UDP和开箱即用,例如:

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

mpgws1up3#

您可以建立UDF来执行此操作

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

UDF将接收列并根据前缀检查它,然后您可以按如下方式使用它:

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|
+-----------+------+
jv4diomz

jv4diomz4#

Spark 3.3.0增加了startswith函数。
[SPARK-37520][SQL]添加startswith()endswith()字符串函数
https://issues.apache.org/jira/browse/SPARK-37520
https://spark.apache.org/docs/3.3.0/api/sql/index.html#startswith
用途

> SELECT startswith('Spark SQL', 'Spark');
 true
> SELECT startswith('Spark SQL', 'SQL');
 false
> SELECT startswith('Spark SQL', null);
 NULL
> SELECT startswith(x'537061726b2053514c', x'537061726b');
 true
> SELECT startswith(x'537061726b2053514c', x'53514c');
 false

相关问题