在Apache Spark API中,我可以使用startsWith
函数来测试列的值:
myDataFrame.filter(col("columnName").startsWith("PREFIX"))
是否可以在 Spark SQL 表达式中做同样的事情,如果是这样,您能否展示一个例子?
使用 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>
我找到了以下解决方案,该解决方案适用于没有自定义UDP且开箱即用的Spark SQL查询,例如:
CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1
您可以创建一个 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|
+-----------+------+
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