在 sparklyr 中使用外部参数创建和应用 ml_lib 管道

Creating and applying ml_lib pipeline with external parameter in sparklyr

我正在尝试创建并应用一个 Spark ml_pipeline 对象,该对象可以处理会变化的外部参数(通常是日期)。根据 Spark 文档,这似乎是可能的:请参阅 ParamMap here

部分

我还没有尝试过具体的操作方法。我在想这样的事情:

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...

这确实不是 Spark ML 管道的用途。一般来说,将输入数据集转换为适合 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))

并为 fit

提供 statement Param
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 nor ml_transform / ml_predict 都不支持额外的 Params(如您所见,... 被简单地忽略了)。