在Apache Spark API中,我可以使用startsWith函数来测试列的值:
startsWith
myDataFrame.filter(col("columnName").startsWith("PREFIX"))
是否可以在Spark SQL表达式中做同样的事情?如果可以,请给出一个示例。
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>
i7uaboj42#
我发现下面的解决方案,工作与Spark SQL查询没有自定义UDP和开箱即用,例如:
CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1
mpgws1up3#
您可以建立UDF来执行此操作
import org.apache.spark.sql.functions val startsWith = udf((columnValue: String) => columnValue.startsWith("PREFIX"))
UDF将接收列并根据前缀检查它,然后您可以按如下方式使用它:
myDataFrame.filter(startsWith($"columnName"))
如果要将参数作为前缀,可以使用lit
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| +-----------+------+
jv4diomz4#
Spark 3.3.0增加了startswith函数。[SPARK-37520][SQL]添加startswith()和endswith()字符串函数https://issues.apache.org/jira/browse/SPARK-37520https://spark.apache.org/docs/3.3.0/api/sql/index.html#startswith用途
startswith()
endswith()
> 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
4条答案
按热度按时间s8vozzvw1#
使用regexp_replace,您可以在不使用UDF的情况下获得相同的结果。
或者使用regexp_extract()
使用instr()函数
i7uaboj42#
我发现下面的解决方案,工作与Spark SQL查询没有自定义UDP和开箱即用,例如:
mpgws1up3#
您可以建立UDF来执行此操作
UDF将接收列并根据前缀检查它,然后您可以按如下方式使用它:
如果要将参数作为前缀,可以使用
lit
输入示例
输出示例
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
用途