Java String в UDF Проблема для новичков - PullRequest
0 голосов
/ 26 июня 2018

Сделав это ниже и прочитав материал об объектах-компаньонах, я не могу сказать, что следую ему в 2018 году и могу хорошо объяснить другим:

import org.apache.spark.sql.functions._

val myUDf = udf((s:String) => Array(s.trim.replaceAll(" +", " "))) // <----

//error: object java.lang.String is not a value --> use Array

val data = List("i  like    cheese", "  the dog runs   ", "text111111   text2222222")
val df = data.toDF("val")
df.show()

 val new_df = df
  .withColumn("udfResult",myUDf(col("val")))
  .withColumn("new_val", col("udfResult")(0)) // <----
  .drop("udfResult")                          // <----

 new_df.show

Есть ли более элегантный способ избавиться от Array в этом и каким-то образом использовать String?

1 Ответ

0 голосов
/ 26 июня 2018

Проблема в определении самого myUdf. Нет необходимости заключать строку в массив:

val myUDf = udf((s: String) => s.trim.replaceAll("\\s+", " ")) // <-- no Array(...)

Тогда нет необходимости чрезмерно играть с колонками:

val new_df = df.withColumn("new_val", myUDf(col("val")))

+--------------------+--------------------+
|                 val|             new_val|
+--------------------+--------------------+
|   i  like    cheese|       i like cheese|
|     the dog runs   |        the dog runs|
|text111111   text...|text111111 text22...|
+--------------------+--------------------+
...