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



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

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

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

在spark中,我们选择只给出2个参数,但我需要使用第三个参数,其int值基本上为(-1(

Col具有类似的价值

SNNNN NNNNN NNSNN SNSNS NNNNS

预期代码:-instr("ColName", "S", -1)预期结果:-1 0 3 5 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  |
* +------+---+
*/

在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|
+------+--------+*/

最新更新