Я использую Apache Spark с Scala для создания ML-конвейера. Один из трансформаторов, которые у меня есть в моем конвейере, на самом деле стоит дорогостоящей операцией join
. Поскольку у меня есть много функций в моем ParamGrid
, это означает, что программа должна удерживать этот огромный, объединенный DataFrame
в памяти, в то время как он оптимизирует каждую функцию в сетке.Понимать роль UID в Spark MLLib Transformer
Чтобы решить эту проблему, я создал обычай Transformer
, который кэширует этот большой промежуточный DataFrame
, написав его на паркет в S3 и вернув DataFrame, который читается с паркета. Это хорошо работало и увеличивало скорость модели до Я добавил функции к ParamGrid
, которые были поставлены перед стадией кеширования. Когда я пишу паркет S3, я использую путь, который определяется:
class Cacher(override val uid: String) extends Transformer {
// the cachePath variable determines the path within the S3 bucket
lazy val cachePath = Identifiable.randomUID(uid + "transformer-cache")
// ...
Я думаю, что я недоразумение как uid
работаю ... моя вера была, что всякий раз, когда искра оптимизирована над ParamGrid
, потребовалось бы то ни было классами были поставлены в этот момент в конвейере, создали новые экземпляры их и дали им новые уникальные uid
s, чтобы отслеживать их. Я подозреваю, что кэширование идет наперекосяк, потому что Spark не дает уникального uid
новым экземплярам Transformer
, которые он создает, что означает, что кешированный паркет постоянно перезаписывается всякий раз, когда создается новый экземпляр кэша Transformer
. Может ли кто-нибудь дать указатели на то, как создавать уникальные случайные uid
s для каждого экземпляра этапа, который создает конвейер?
Cheers!