具有 3 个参数的 Spark 中的 Instr 函数

Instr function in Spark with 3 arguments

我在 Spark 中使用 instr() 函数时遇到问题。函数的定义如下所示: instr(Column str, String substring)

我想像在 Impala 中一样使用 instr,例如:

instr(Column str, String substring, Int [position]) - return index position

在 spark 中,我们选择只提供 2 个参数,但我需要使用 int 值的第 3 个参数(-1)

Col 的值类似于

SNNNN NNNNN NNSNN SNSNS NNNNS

预期代码:- instr("ColName", "S", -1) 预期结果:- 1 0 3 5 5

在spark中使用UDF的解决方案:

import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq("SNNNN","NNNNN","NNSNN","SNSNS","NNNNS")).toDF("values")
val findIndexUDF = udf( (x: String) => (x.lastIndexOf("S")+1))
df.withColumn("indexval", findIndexUDF($"values")).show()
/*+------+--------+
|values|indexval|
+------+--------+
| SNNNN|       1|
| NNNNN|       0|
| NNSNN|       3|
| SNSNS|       5|
| NNNNS|       5|
+------+--------+*/

如果您想使用 -ve 职位编号,substring_index + length 可能会有所帮助,如下所示-

 val frame = Seq("SNNNN","NNNNN","NNSNN","SNSNS","NNNNS").toDF("values")
    frame.withColumn("x", length($"values") - length(substring_index($"values", "S", -1)))
      .show(false)
    /**
      * +------+---+
      * |values|x  |
      * +------+---+
      * |SNNNN |1  |
      * |NNNNN |0  |
      * |NNSNN |3  |
      * |SNSNS |5  |
      * |NNNNS |5  |
      * +------+---+
      */