我这样定义了一个管道变形金刚:
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已序列化以分派给执行者,因此每个参数都应该可序列化。
如何绕过它?有解决方法吗?
谢谢。
答案 0 :(得分:0)
这个问题好像有点老了... 我不知道我的(未经测试的)想法是否符合您的需求。
解决方案可能是使用 SQL 表达式(一个 String 实例)
val pipeline = new Pipeline()
pipeline.setStages(Array(new MyTransformer("test = 'value'")))
pipeline.fit(df).transform(mydf)
并使用 functions.expr()
将表达式字符串转换为 Transformer.transform
方法中的列实例。
这样,条件是可序列化的,不可序列化的对象在执行器中需要时被创建。