【问题标题】:Using Spark ML Pipelines just for Transformations仅将 Spark ML 管道用于转换
【发布时间】:2018-04-18 03:41:14
【问题描述】:

我正在从事一个项目,其中可配置的管道和对 Spark DataFrames 更改的沿袭跟踪都是必不可少的。此管道的端点通常只是修改后的 DataFrame(将其视为 ETL 任务)。对我来说最有意义的是利用现有的 Spark ML Pipeline API 来跟踪这些更改。特别是,更改(基于其他列添加等)是作为自定义 Spark ML 转换器实现的。

但是,我们现在正在内部讨论这是否是实现此管道的最惯用方式。另一种选择是将这些转换实现为一系列 UDF,并基于 DataFrame 的模式历史记录(或 Spark 的内部 DF 沿袭跟踪)构建我们自己的沿袭跟踪。这方面的论点是,Spark 的 ML 管道不仅仅用于 ETL 作业,而且应该始终以生成可以馈送到 Spark ML Evaluator 的列为目标来实现。反对这一方面的论点是,它需要大量反映现有功能的工作。

将 Spark 的 ML 管道严格用于 ETL 任务有什么问题吗?仅使用 Transformer 且不包括 Evaluator 的任务?

【问题讨论】:

    标签: apache-spark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    对我来说,这似乎是一个好主意,特别是如果您可以将生成的不同管道组合成新的管道,因为管道本身可以由不同的管道组成,因为管道从 PipelineStage 向上延伸(来源:https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.ml.Pipeline) .

    但请记住,您可能会按照此处 (https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-mllib/spark-mllib-transformers.html) 的说明在后台做同样的事情:

    在内部,transform 方法使用 Spark SQL 的 udf 定义一个函数(基于上述 createTransformFunc 函数),该函数将创建新的输出列(具有适当的 outputDataType)。 UDF 稍后应用于输入 DataFrame 的输入列,结果成为输出列(使用 DataFrame.withColumn 方法)。

    如果您决定采用其他方法或找到更好的方法,请发表评论。很高兴分享有关 Spark 的知识。

    【讨论】:

      猜你喜欢
      • 2017-08-24
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2016-05-31
      相关资源
      最近更新 更多