2016-05-30 86 views
2

我試圖延長sparkml帶有過濾器變壓器管道模型TypeTag,後星火據幀UDF無

abstract class RuleFilter[IN, T <: RuleFilter[IN, T]] 
    extends RuleTransformer with HasInputCol { 
    // def filterFuntion: String 
    /** @group setParam */ 
    def setInputCol(value: String): T = set(inputCol, value).asInstanceOf[T] 

    protected def createFilterFunc: IN => Boolean 

    override def transform(df: DataFrame): DataFrame = { 
    transformSchema(df.schema, logging = true) 
    val transformUDF = udf[Boolean, IN](this.createFilterFunc) 
    df.filter(transformUDF(df($(inputCol)))) 
    } 
} 

這段代碼沒有一個錯誤編譯:

No TypeTag available for IN 
[error]  val transformUDF = udf[Boolean, IN](this.createFilterFunc) 

我該怎麼辦讓這個工作?

我需要它在繼承類中的一些明確的定義類型的工作,如

class PriceFilter extends RuleFilter { 
    def createFilterFunc(val: Double) = val > 500 
} 

回答

1

你需要明確地告訴編譯器,你想TypeTagIn類型:

import scala.reflect.runtime.universe._ 
abstract class RuleFilter[In: TypeTag, T <: RuleFilter[In, T]] 
+0

的https: //github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/Transformer.scala#L82,但是這個UnaryTransformer工作正常,沒有明確的TypeTag,這是如何工作的? – tintin

+0

什麼是udf?它對這種類型有什麼作用? –