Я ищу способ сравнения подмножеств RDD разумно.Сравнение подмножеств RDD
Допустим, у меня был RDD с парами ключ/значение типа (Int-> T). В конечном итоге мне нужно сказать «сравнить все значения ключа 1 со всеми значениями ключа 2 и сравнить значения ключа 3 со значениями ключа 5 и ключа 7», как бы я мог сделать это эффективно?
Пути я сейчас думаю сделать это путем создания списка отфильтрованного РДА, а затем с помощью RDD.cartesian()
def filterSubset[T] = (b:Int, r:RDD[(Int, T)]) => r.filter{case(name, _) => name == b}
Val keyPairs:(Int, Int) // all key pairs
Val rddPairs = keyPairs.map{
case (a, b) =>
filterSubset(a,r).cartesian(filterSubset(b,r))
}
rddPairs.map{whatever I want to compare…}
Я бы тогда перебирать список и выполнить карту на каждом из RDD пар для сбора реляционных данных, которые мне нужны.
То, что я не могу сказать об этой идее, заключается в том, было бы крайне неэффективно устанавливать, возможно, сотни заданий на карту, а затем перебирать их через них. В этом случае ленивая оценка в искровом режиме оптимизирует перетасовку данных между всеми картами? Если нет, может кто-то может рекомендовать, возможно, более эффективный способ решения этой проблемы?
Спасибо за вашу помощь
Может вам лучше объяснить логику сравнения? Какие ключи вы хотите сравнить? –
Конечно, хорошим примером этого может быть, если бы у меня был RDD [(Int, Vector)], и я только хотел рассчитать косинус-сходство векторов с соответствующими ключами (ключи по существу разделяют разные группы векторов). –
Сколько у вас данных за ключ? Это сопоставление «один к одному» или вы хотите сравнить с несколькими подмножествами (например, 1 с {2, 3, 5, 7})? – zero323