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