У меня есть сценарий, такой как то, что включено ниже, где мне нужно искать последовательность для каждого значения идентификатора, и, если найдено совпадение, мне нужно получить соответствующее имя и заполнить столбец Имя в кадре данных (Я специально держал его таким образом, чтобы избежать объединения) .. сценарий
Мне удалось создать универсальный метод, который выполняет свою работу, но проблемас этой реализацией, если массив слишком велик, он взрывает кучу пространства данных.
v1: не масштабируется
def colTransform(refCol: String,newCol: String,lookUpArray: Array[Seq[Any]],index: Int)(df: DataFrame): DataFrame = {
df.withColumn(newCol,
concat_ws("",array(
lookUpArray.map{c =>
when(col(refCol).contains(c(0)), c(index).toString).otherwise(lit(""))
}: _*
)
)
)
}
вторая версия проще, но имеет небольшую проблему
def colTransform(
refCol: String,newCol: String,lookUpArray: Array[Seq[Any]],index: Int)(df: DataFrame): DataFrame = {
df.withColumn(newCol,
lit(s"${lookUpArray.filter{c =>
df(refCol) == lit(c(0))
}.map{c => if (c.length == 0) "Unknown" else c(index)}.mkString("")}")
)
}
проблема в том, что метод фильтра, примененный к lookUpArray (строка 3), ожидает логическое значение .. поэтому я предоставляю df (refCol) == lit (c (0)) .. но это всегдаоцените как false, так как тип слева - это Column, где справа - String.Он компилируется и запускается, но конечным результатом является пустой столбец (потому что все отфильтровывается, а затем mkString ("") на пустом Seq приводит к "" .. Если у вас есть какой-либо совет или мысль, пожалуйста, дайте мне знать..