在spark中的substring中使用length函数

时间:2017-09-21 21:21:57

标签: scala apache-spark dataframe substring string-length

我试图在DataFrame的子字符串函数中使用length函数 但它给出了错误

val substrDF = testDF.withColumn("newcol", substring($"col", 1, length($"col")-1))

以下是错误

 error: type mismatch;
 found   : org.apache.spark.sql.Column
 required: Int

我正在使用2.1。

5 个答案:

答案 0 :(得分:16)

可以使用函数“expr”:

val data = List("first", "second", "third")
val df = sparkContext.parallelize(data).toDF("value")
val result = df.withColumn("cutted", expr("substring(value, 1, length(value)-1)"))
result.show(false)

输出:

+------+------+
|value |cutted|
+------+------+
|first |firs  |
|second|secon |
|third |thir  |
+------+------+

答案 1 :(得分:8)

你也可以使用$“COLUMN”。substr

val substrDF = testDF.withColumn("newcol", $"col".substr(lit(1), length($"col")-1))

输出:

val testDF = sc.parallelize(List("first", "second", "third")).toDF("col")
val result = testDF.withColumn("newcol", $"col".substr(org.apache.spark.sql.functions.lit(1), length($"col")-1))
result.show(false)
+------+------+
|col   |newcol|
+------+------+
|first |firs  |
|second|secon |
|third |thir  |
+------+------+

答案 2 :(得分:1)

您收到该错误是因为substring的签名是

def substring(str: Column, pos: Int, len: Int): Column 

您传递的len参数为Column,应为Int

您可能希望实现一个简单的UDF来解决该问题。

val strTail = udf((str: String) => str.substring(1))
testDF.withColumn("newCol", strTail($"col"))

答案 3 :(得分:1)

如果你想要的只是删除字符串的最后一个字符,你也可以不使用UDF。使用regexp_replace

testDF.show
+---+----+
| id|name|
+---+----+
|  1|abcd|
|  2|qazx|
+---+----+

testDF.withColumn("newcol", regexp_replace($"name", ".$" , "") ).show
+---+----+------+
| id|name|newcol|
+---+----+------+
|  1|abcd|   abc|
|  2|qazx|   qaz|
+---+----+------+

答案 4 :(得分:0)

您必须使用 SUBSTR 函数来实现这一点。

val substrDF = testDF.withColumn("newcol", 'col.substr(lit(1), length('col)-1))

第一个参数是你想要修剪数据的位置,第二个参数是修剪字段的长度。 (startPos: Int,len: Int)