Comme SergGr suggéré, vous pouvez prolonger UnaryTransformer
. Cependant, c'est assez difficile.
REMARQUE: Tous les commentaires ci-dessous s'appliquent à Spark version 2.2.0.
Pour résoudre le problème décrit dans SPARK-12606, où ils recevaient "...Param null__inputCol does not belong to..."
, vous devez mettre en œuvre String uid()
comme ceci:
@Override
public String uid() {
return getUid();
}
private String getUid() {
if (uid == null) {
uid = Identifiable$.MODULE$.randomUID("mycustom");
}
return uid;
}
Apparemment, ils ont été dans le uid Initialisation constructeur. Mais la chose est que inputCol
(et outputCol
) de UnaryTransformer est initialisé avant que uid
soit initialisé dans la classe d'héritage. Voir HasInputCol
:
final val inputCol: Param[String] = new Param[String](this, "inputCol", "input column name")
Voici comment Param
est construit:
def this(parent: Identifiable, name: String, doc: String) = this(parent.uid, name, doc)
Ainsi, lorsque parent.uid
est évalué, la mise en œuvre personnalisée uid()
est appelée et à ce point uid
est encore nulle. En implémentant uid()
avec évaluation paresseuse vous vous assurez que uid()
ne renvoie jamais null.
Dans votre cas si:
Param d7ac3108-799c-4aed-a093-c85d12833a4e__inputCol does not belong to fe3d99ba-e4eb-4e95-9412-f84188d936e3
il semble être un peu différent. Parce que "d7ac3108-799c-4aed-a093-c85d12833a4e" != "fe3d99ba-e4eb-4e95-9412-f84188d936e3"
, il semble que votre implémentation de la méthode uid()
renvoie une nouvelle valeur à chaque appel. Peut-être que dans votre cas, il a été mis en œuvre si:
@Override
public String uid() {
return Identifiable$.MODULE$.randomUID("mycustom");
}
Par ailleurs, lors de l'extension UnaryTransformer
, assurez-vous que la fonction de transformation est Serializable
.
Cela ne fonctionne pas. Je suppose que c'est à cause d'un bug. Je reçois '' '' java.lang.IllegalArgumentException: l'exigence a échoué: Le paramètre d7ac3108-799c-4aed-a093-c85d12833a4e__inputCol n'appartient pas à fe3d99ba-e4eb-4e95-9412-f84188d936e3.''' – LonsomeHell
@LonsomeHell, juste pour vérifier , êtes-vous sûr de l'avoir configuré avec une colonne d'entrée valide? – SergGr
Oui, j'ai utilisé setInput avec un nom de colonne valide. – LonsomeHell