2016-05-30 13 views
2

Ich versuche sparkml Pipeline-Modell mit einem Filtertransformator zu verlängern, nachSpark-Datenrahmen UDF Keine TypeTag verfügbar

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)))) 
    } 
} 

dieser Code nicht mit einem Fehler kompilieren haben:

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

wie kann ich lass das funktionieren?

Ich brauche es mit etwas explizit definierten Art in erben Klasse zu arbeiten wie

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

Antwort

1

Sie müssen explizit den Compiler sagen, dass Sie ein TypeTag für Typ wollen In:

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, aber dieser UnaryTransformer funktioniert gut ohne TypeTag, wie funktioniert das? – tintin

+0

Was ist "udf"? Was macht es mit dem Typ? –

Verwandte Themen