instr函数

ix0qys7i  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(442)

我对使用 instr() 在spark中起作用。函数的定义如下: instr(Column str, String substring) 我想用 instr 以同样的方式 Impala 比如: instr(Column str, String substring, Int [position]) - return index position 在spark中,我们选择只提供2个参数,但是我需要使用第3个参数,基本上是int值(-1)
col有如下价值 SNNNN NNNNN NNSNN SNSNS NNNNS 预期code:- instr("ColName", "S", -1) 预期结果: 1 0 3 5 5

9q78igpj

9q78igpj1#

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

oo7oh9g92#

如果你想和我一起去的话 -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  |
      * +------+---+
      */

相关问题