DataFrame
のサブストリング関数内で長さ関数を使用しようとしていますが、エラーが発生します
val substrDF = testDF.withColumn("newcol", substring($"col", 1, length($"col")-1))
以下はエラーです
error: type mismatch;
found : org.Apache.spark.sql.Column
required: Int
2.1を使用しています。
関数「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 |
+------+------+
$ "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 |
+------+------+
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"))
文字列の最後の文字を削除するだけであれば、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|
+---+----+------+