项目场景:
在大数据项目中,经常会使用到spark。spark任务使用rdd的时候,特别要注意数据能否进行序列化
问题描述:
代码如下
val features = preFeatureDf
// .withColumn("label",col("label").cast(IntegerType))
.withColumn("allTraitData", struct(columnNameArray.map(col): _*))
.drop(columnNameArray: _*)
.withColumn("feature",
udf[String,Row] { row => {
val (featureTransformer, featureTransformerConfig) = FeatureConfigGenerate.getOrCreate(inputFeatureConf)
val binding = new VariableBinding(64, featureTransformerConfig.getVarsize)
val globalContext = new DefaultGlobalContext
globalContext.setValueBinding(binding)
val personaValues: PersonaValues = structRow2ColumnPersonaValues(row, columnNameArray.toArray)
val arrayOps = featureTransformer.transform(personaValues, globalContext)
arrayOps2PrettyVal(arrayOps)
}
}.apply(col("allTraitData"))
)
修改了其他一行代码后,报错Task not Serializable
al (featureTransformer, featureTransformerConfig) = FeatureConfigGenerate.getOrCreate(inputFeatureConf.toString)
其中,inputFeatureConf是个jsonArray对象。
原因分析:
当前的scala版本,不支持jsonArray的序列化,导致报错。以后遇到这种无法序列化的问题,一般都是从driver端传递了给executor一个无法序列化的参数。通过排查哪些参数是从driver端传递过来的进行排查。
解决方案:
将inputFeatureConf.toString的操作放在driver端进行就可以了。