Сравнивая пары данных, объединяя только иногда
Я использую Spark. у меня есть JavaPairRDD
формы <Documentname, Tuple2<Phrase, URL>>
,
Я в основном проверил, есть ли фраза на странице, указанной в URL, что приводит к приведенной выше структуре.
Теперь у меня есть несколько накладывающихся друг на друга фраз (т.е. "быть или" находится в "быть или не быть"), и я хочу удалить эти более короткие фразы, содержащиеся в более крупных фразах.
Я немного новичок в Spark, поэтому я не уверен, как это сделать в Spark.
Я знаю, что мог бы создать двойной вложенный цикл и сделать это, если собираю () элементы, но мне интересно, есть ли способ сделать это в Spark с сокращением или агрегацией.
По сути, я хочу функцию, которая будет проверять каждую пару фраз и либо возвращать обе фразы, если одна не содержится внутри другой, либо только одну фразу, если таковая есть.
Кроме того, я хотел бы запустить какой-то фильтр, чтобы удалить эти короткие фразы.
Есть идеи?
Редактировать: я думаю, что CombinebyKey или AggregateByKey будут работать, но я не знаю, как использовать их в Java. Что такое функция последовательности / объединителя?
Я хочу объединить несколько элементов> по ключу и получить список кортежей, в которых одна фраза не содержится ни в одной из других.
1 ответ
Если бы вы группировали по ключу (documentName), у вас была бы обычная коллекция фраз, которые вы можете зациклить и обработать (для каждого документа). Это будет работать до тех пор, пока общее количество фраз относительно невелико, поэтому коллекция помещается в памяти.
Если вам нужно сделать это распределенным способом, вам нужно будет выполнить flatMap для преобразования ключа в DodumentName+Phrase, чтобы позже вы могли уменьшить (объединить) по сходству