Как предложил SergGr, вы можете расширить UnaryTransformer
. Однако это довольно сложно.
ПРИМЕЧАНИЕ. Все приведенные ниже комментарии относятся к Spark версии 2.2.0.
Чтобы решить проблему, описанную в SPARK-12606, где они получали "...Param null__inputCol does not belong to..."
, вы должны реализовать String uid()
следующим образом:
@Override
public String uid() {
return getUid();
}
private String getUid() {
if (uid == null) {
uid = Identifiable$.MODULE$.randomUID("mycustom");
}
return uid;
}
Видимо они инициализировали uid в конструкторе. Но дело в том, что inputCol
(и outputCol
) UnaryTransformer инициализируется до того, как uid
будет инициализирован в наследующем классе. См. HasInputCol
:
final val inputCol: Param[String] = new Param[String](this, "inputCol", "input column name")
Вот как строится Param
:
def this(parent: Identifiable, name: String, doc: String) = this(parent.uid, name, doc)
Таким образом, когда оценивается parent.uid
, вызывается пользовательская реализация uid()
, и в этот момент uid
все еще равно нулю. Реализуя uid()
с ленивой оценкой, вы гарантируете, что uid()
никогда не вернет значение null.
Хотя в вашем случае:
Param d7ac3108-799c-4aed-a093-c85d12833a4e__inputCol does not belong to fe3d99ba-e4eb-4e95-9412-f84188d936e3
кажется, это немного другое. Поскольку "d7ac3108-799c-4aed-a093-c85d12833a4e" != "fe3d99ba-e4eb-4e95-9412-f84188d936e3"
, похоже, что ваша реализация метода uid()
возвращает новое значение при каждом вызове. Возможно в вашем случае было реализовано это так:
@Override
public String uid() {
return Identifiable$.MODULE$.randomUID("mycustom");
}
Кстати, при расширении UnaryTransformer
убедитесь, что функция преобразования Serializable
.
person
vixter
schedule
16.08.2017