Создание и применение конвейера ml_lib с внешним параметром в sparklyr - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь создать и применить объект Spark ml_pipeline, который может обрабатывать внешний параметр, который будет меняться (обычно это дата).Согласно документации Spark, это кажется возможным: см. Часть с ParamMap здесь

Я не пытался точно, как это сделать.Я думал о чем-то вроде этого:

table.df <- data.frame("a" = c(1,2,3))
table.sdf <- sdf_copy_to(sc, table.df)

param = 5
param2 = 4

# operation declaration
table2.sdf <- table.sdf %>% 
  mutate(test = param)

# pipeline creation
pipeline_1 = ml_pipeline(sc) %>%
  ft_dplyr_transformer(table2.sdf) %>%
  ml_fit(table.sdf, list("param" = param))

# pipeline application with another value for param
table2.sdf <- pipeline_1 %>% 
  ml_transform(table.sdf, list("param" = param2))

#result

glimpse(table2.sdf %>% select(test))
# doesn work...

1 Ответ

1 голос
/ 28 мая 2019

Это не совсем то, как предполагается использовать Spark ML Pipelines. В общем, все преобразования, необходимые для преобразования входного набора данных в формат, подходящий для Pipeline, должны применяться заранее, и только общие компоненты должны быть встроены как stages.

При использовании нативного (Scala) API технически возможно, в таких простых случаях, как этот, использовать пустой SQLTransformer:

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.SQLTransformer
import org.apache.spark.ml.param.ParamPair

val df = spark.range(1, 4).toDF("a")

val sqlTransformer = new SQLTransformer()
val pipeline = new Pipeline().setStages(Array(sqlTransformer))

и поставка statement Param для обоих fit

val model = pipeline.fit(
  df,
  ParamPair(sqlTransformer.statement, "SELECT *, 4 AS `test` FROM __THIS__")
)

model.transform(df).show
+---+----+
|  a|test|
+---+----+
|  1|   4|
|  2|   4|
|  3|   4|
+---+----+

и transform:

model.transform(
  df,
  ParamPair(sqlTransformer.statement, "SELECT *, 5 AS `test` FROM __THIS__")
 ).show
+---+----+
|  a|test|
+---+----+
|  1|   5|
|  2|   5|
|  3|   5|
+---+----+

, но ни ml_fit, ни ml_transform / ml_predict на данный момент не поддерживают дополнительные Params (как вы можете видеть ... просто игнорируются).

...