Я хочу написать класс Key класса JavaPairRDD и реализовать свою логику соединения. Поэтому мне нужно переписать методы equals() и hashCode() для ключевого класса, или переписывать других. Например: Вы знаете, что JavaPairRDD.join (JavaPairRDD) очень прост, как раз при сопоставлении StringKey1.equals (StringKey2). Но для меня я надеюсь, что даже если подстрока key1 просто key2 также будет сопоставлена. Поэтому я думаю, что мне нужно написать класс переноса, чтобы рассказать Спарк, если они соответствуют моей логике, вы должны рассматривать их как один и тот же ключ и присоединяться к ним. например, «ab» следует присоединить к «abc».какие методы искрового соединения зависят от завершения соединения
ответ
Вам необходимо переопределить как equals
, так и hashCode
. ОДНАКО, вам нужно будет попытаться явно указать ваш объект other
, так как совпадение шаблонов не работает. Я все еще пытаюсь понять, почему совпадение терпит неудачу только по типу (я предполагаю сериализацию). Также имейте в виду, что если ключевые объекты действительно не совпадают, тогда один будет переопределять другой в конечном выходе ... который может быть не таким, каким вы хотите.
case class Foo(x: String) {
override def equals(other: Any) = {
Option(other).map(_.asInstanceOf[Foo]).getOrElse(null)
match
{
case f : Foo =>
x contains(f.x)
case _ => false
}
}
override def hashCode() = 1
}
sc.parallelize(List((Foo("abcdefg"),1))).join(sc.parallelize(List((Foo("abcdef"),1)))).collect
Большое спасибо Джастину, я ценю подробный пример кода. Я также добавил метод hashCode(), он работает сейчас! Но я не понимаю, почему для операции «Присоединиться» нужны два метода для идентификации одного и того же ключа, только равно() недостаточно? На самом деле hashCode ничего не сделал. Почему scala/spark разрабатывают это правило? – Jack
@Jack Я думаю, что важно упомянуть, что решение, которое всегда возвращает тот же «hashCode», эффективно устраняет все шансы распараллеливать вычисления по узлам. 'hashcode' используется для назначения заданного ключа разделу. 'hashCode() = 1' будет использовать один узел, так какой смысл использовать Spark? Вместо этого используйте локальное решение. – maasg
@maag Это действительно имеет смысл, см. Мои комментарии ниже для вашего доброго сообщения. – Jack
Взлом семантику equals
и hashCode
, чтобы заставить искру присоединиться на вещи, которые не равны, является плохой идеей.
Spark полагается на ключ hashCode
ключа для разделения данных на кластере. Принуждение константы hashCode заставит данные перейти к одному разделу, исключая возможность распределения вычислений в кластере. Это означает, что вычисление может быть/должно выполняться в одном узле, возможно, с использованием правильных одноузловых методов.
Эта проблема может быть решена с помощью Спарк, принимая другой подход:
val data1 = List("abcd" -> 4, "defghy" -> 6 , "wxxyyy" -> 3, "az" -> 24)
val data2 = List("ab" -> 2, "fghz" -> 3 , "y" -> 1, "a" -> 2)
val base = sparkContext.parallelize(data1)
val jn = sparkContext.parallelize(data2)
val cartesian = base.cartesian(jn)
val joined = cartesian.collect{case ((k1,v1),(k2,v2)) if (k1.contains(k2)) => (k1,(v1,v2))}
joined.collect
Это приводит к:
res6: Array[(String, (Int, Int))] = Array((abcd,(4,2)), (defghy,(6,1)), (wxxyyy,(3,1)), (az,(24,2)))
Эй, Джерард, это потрясающе! Огромное спасибо! Мне очень нравится ваше решение! и я положил его на свой код. Еще раз спасибо! -Jack – Jack
Кстати, у декартова есть небольшая проблема с производительностью, так как это соединения MxN. – Jack
@Jack это по сути проблема m x n, если мы не можем каким-то образом ее ограничить. Например, если вместо подстроки мы могли бы сказать «startsWith», мы могли бы сначала присоединиться к 1-му символу. – maasg
- 1. Очень медленно для искрового соединения RDD
- 2. попытка соединения SQL-соединения
- 3. Отображать данные от соединения?
- 4. Обновление от внутреннего соединения
- 5. Is Socket.close() считается чистым способом завершения соединения?
- 6. Внедрить пакет для завершения TCP-соединения
- 7. Связано ли соединение AFNetworking после завершения соединения
- 8. методы тестирования, которые зависят друг от друга
- 9. методы создания, которые не зависят от объекта
- 10. Как узнать, какие сборки зависят от system.web.mvc?
- 11. Определить, какие объекты зависят от последовательности?
- 12. Длинные соединения DB или соединения по требованию?
- 13. Поведение соединения Tomcat JNDI отличается от JDBC-соединения
- 14. какие максимальные соединения mqtt поддерживаются activeemq 5.10.0
- 15. Определите, какие соединения шифрования HTTPS используют шифрование
- 16. c3p0 Объединенные соединения Фантомные соединения
- 17. Завершение соединения «сброс соединения» peer '
- 18. Ошибка PMTA от ошибок соединения
- 19. SQL #/отсчитываются от внутреннего соединения
- 20. пролога получить срок от соединения
- 21. Обновление от синтаксиса внутреннего соединения
- 22. условие соединения зависит от параметра
- 23. Localhost Отклонение соединения от приложения
- 24. Отказ от соединения с хостом
- 25. Соединения MongoDB от AWS Lambda
- 26. Соединения Https от Android WebView
- 27. Получить идентификатор соединения от ServerSocket
- 28. Определение быстрого соединения однорангового соединения BitTorrent
- 29. WCF, BasicHttpBinding: Стоп новые соединения, но разрешить существующие соединения продолжать
- 30. Правильно закрыты соединения SqlCommand
Я попытался переписать метод Equals, но это не сработало. – Jack
Huh .... не могли бы вы объяснить свою проблему немного полнее? Иногда это может даже привести к решению проблемы ... –
Спасибо, Джастин, я его модифицировал. – Jack