Вы не можете использовать функции scala напрямую при манипуляции с фреймом данных с помощью API SparkSQL.Вы можете использовать только функции «столбца», определенные в классе Column
или в классе functions
.Они в основном преобразуют столбцы в столбцы.Фактические вычисления обрабатываются в Spark.
Чтобы проиллюстрировать это, вы можете попробовать это в REPL:
scala> df("COL1").cast("int")
res6: org.apache.spark.sql.Column = CAST(COL1 AS INT)
Тип Column
, а не int
, и именно поэтомуscala отказывается применять вашу функцию (которая ожидает целое число) к такому объекту.
Чтобы использовать пользовательскую функцию, вам нужно обернуть ее в UDF следующим образом:
val ageUDF = udf((age : Int) => AgeClassification.AgeCategory(age))
// or shorter
val ageUDF = udf(AgeClassification.AgeCategory _)
// The you may use it this way:
df.withColumn("classif", ageUDF(df("age")))
Примечаниетакже, что df.age
работает в pyspark, но это не является действительным ни scala.Для краткого доступа к столбцам по имени вы можете импортировать spark.implicits._
и писать $"age"
или даже короче 'age
.