Apache Spark:将Column作为Transformer参数传递

时间:2019-10-16 11:13:19

标签: apache-spark serialization apache-spark-sql apache-spark-ml

我这样定义了一个管道变形金刚:

class MyTransformer(condition: Column) extends SparkTransformer { 
   override def transform(dataset: Dataset[_]): DataFrame = {...}
 }

然后在管道中使用:

val pipeline = new Pipeline()
pipeline.setStages(Array(new MyTransformer(col("test).equals(lit("value"))))
pipeline.fit(df).transform(mydf)

在我的转换器中,我只想对验证条件的行应用转换。

这会导致序列化问题:

Serialization stack:
- object not serializable (class: org.apache.spark.sql.Column, value: (test = value))
- field (class: my.project.MyTransformer, name: condition, type: class org.apache.spark.sql.Column)
- ...

根据我的理解,该Transformer已序列化以分派给执行者,因此每个参数都应该可序列化。

如何绕过它?有解决方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这个问题好像有点老了... 我不知道我的(未经测试的)想法是否符合您的需求。

解决方案可能是使用 SQL 表达式(一个 String 实例)

val pipeline = new Pipeline()
pipeline.setStages(Array(new MyTransformer("test = 'value'")))
pipeline.fit(df).transform(mydf)

并使用 functions.expr() 将表达式字符串转换为 Transformer.transform 方法中的列实例。

这样,条件是可序列化的,不可序列化的对象在执行器中需要时被创建。