Apache Spark用SQL表达式启动

时间:2019-01-03 13:50:21

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

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

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

是否可以在Spark SQL表达式中执行相同的操作,如果可以,请举个例子吗。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以创建一个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|
+-----------+------+

答案 2 :(得分:0)

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

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