web-dev-qa-db-fra.com

utiliser la fonction de longueur dans la sous-chaîne dans spark

J'essaie d'utiliser la fonction de longueur à l'intérieur d'une fonction de sous-chaîne dans un DataFrame, Mais cela donne une erreur 

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

ci-dessous est l'erreur

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

J'utilise 2.1.

7
satish

La fonction "expr" peut être utilisée:

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)

sortie:

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

Vous pouvez aussi utiliser $ "COLUMN" . substr

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

Sortie:

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  |
+------+------+
6
shabbir hussain

Vous obtenez cette erreur parce que la signature de substring est

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

L'argument len que vous passez est un Column et doit être un Int.

Vous voudrez peut-être mettre en œuvre un fichier UDF simple pour résoudre ce problème.

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

Si tout ce que vous voulez, c'est supprimer le dernier caractère de la chaîne, vous pouvez également le faire sans UDF. En utilisant 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|
+---+----+------+
1
philantrovert