Привет, мне нужна помощь, пожалуйста, как оптимизировать этот код, чтобы все функции использовали одно и то же условие в цикле с if подробнее , как использовать с Column Spark Dataframe scala с while
//This function return codcat
def mdp_codcat(bRef: Broadcast[Array[RefRglSDC]]) = udf((sensop: String, cdopcz: String, lieccp:String, qualib: String) =>
{
var codcat ="NOT_CATEGORIZED"
var matchRule = false
var i = 0
while (i < bRef.value.size && !matchRule) {
if ((bRef.value(i).sensop.isEmpty || bRef.value(i).sensop.equals(sensop))
&& (bRef.value(i).cdopcz.isEmpty || Lib.matchCdopcz(cdopcz.substring(1).toInt.toString, bRef.value(i).cdopcz))
&& (bRef.value(i).libope.isEmpty || Lib.matchRule(lieccp, bRef.value(i).libope))
&& (bRef.value(i).qualib.isEmpty || Lib.matchRule(qualib, bRef.value(i).qualib))) {
matchRule = true
codcat = bRef.value(i).codcat
}
i += 1
}
codcat
})
Функция secondde такая же, но этот возврат idregl
def mdp_idregl(bRef: Broadcast[Array[RefRglSDC]]) = udf((sensop: String, cdopcz: String, lieccp:String, qualib: String) =>
{
var idregl ="-1"
var matchRule = false
var i = 0
while (i < bRef.value.size && !matchRule) {
if ((bRef.value(i).sensop.isEmpty || bRef.value(i).sensop.equals(sensop))
&& (bRef.value(i).cdopcz.isEmpty || Lib.matchCdopcz(cdopcz.substring(1).toInt.toString, bRef.value(i).cdopcz))
&& (bRef.value(i).libope.isEmpty || Lib.matchRule(lieccp, bRef.value(i).libope))
&& (bRef.value(i).qualib.isEmpty || Lib.matchRule(qualib, bRef.value(i).qualib))) {
matchRule = true
idregl = bRef.value(i).idregl.toString
}
i += 1
}
idregl
})
Я вызываю эту функцию с помощью withColumn
df.withColumn("mdp_codcat", mdp_codcat(bRef)($"signe",$"cdopcz",$"lib_ope",$"qualif_lib_ope"))
и
df.withColumn("mdp_idregl", mdp_idregl(bRef)($"signe",$"cdopcz",$"lib_ope",$"qualif_lib_ope"))