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