在 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
(如您所见,...
被简单地忽略了)。
我正在尝试创建并应用一个 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
(如您所见,...
被简单地忽略了)。