У меня есть ряд столбцов схем Map[(Int, Int), Row]
и Map[(Int, Int), String]
, карты с ключами int-tuple и некоторыми данными (строка или структура). Я пытаюсь взять эти столбцы, извлечь данные и вставить их в один столбец на основе ключей через UDF, как показано ниже.
case class PersonConcept(field1: Int, field2: Int, field3: String,
field4: String, field5: String)
private def mergeMaps: UserDefinedFunction = {
val f = (keyedData: Map[Row, Row], keyedNames: Map[Row, String],
keyedOccupations: Map[Row, String]) => {
val intKeyedData = keyedData.map {
case (row, data) =>
(row.getInt(0), row.getInt(1)) -> data
}
val intKeyedNames = keyedNames.map {
case (row, data) =>
(row.getInt(0), row.getInt(1)) -> data
}
val intKeyedOccupations = keyedOccupations.map {
case (row, data) =>
(row.getInt(0), row.getInt(1)) -> data
}
intKeyedData
.map {
case (k, v) => {
val value =
PersonConcept(v.getInt(0),
v.getInt(1),
v.getString(2),
intKeyedOccupations(k), // <--- Grabbing occupation
intKeyedNames(k)) // <--- Grabbing name
(k, value)
}
}
}
udf(f)
}
Я знаю, что каждая карта содержит точно такой же набор ключей. Тем не менее, я сталкиваюсь с NoSuchElementException
.
Caused by: java.util.NoSuchElementException: key not found: (24,75)
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
. UDF отлично работает, когда набор данных состоит только из одной строки или одного раздела, что наводит меня на мысль, что это как-то связано с областью действия переменной скросс-раздела или закрытие (http://spark.apache.org/docs/latest/rdd-programming-guide.html#understanding -closures- ). Что я не понимаю, что может быть причиной этого, и есть ли реальный способ сделать это, используя эту модель данных.