2015-04-30 2 views
1

Я хочу написать класс Key класса JavaPairRDD и реализовать свою логику соединения. Поэтому мне нужно переписать методы equals() и hashCode() для ключевого класса, или переписывать других. Например: Вы знаете, что JavaPairRDD.join (JavaPairRDD) очень прост, как раз при сопоставлении StringKey1.equals (StringKey2). Но для меня я надеюсь, что даже если подстрока key1 просто key2 также будет сопоставлена. Поэтому я думаю, что мне нужно написать класс переноса, чтобы рассказать Спарк, если они соответствуют моей логике, вы должны рассматривать их как один и тот же ключ и присоединяться к ним. например, «ab» следует присоединить к «abc».какие методы искрового соединения зависят от завершения соединения

+0

Я попытался переписать метод Equals, но это не сработало. – Jack

+0

Huh .... не могли бы вы объяснить свою проблему немного полнее? Иногда это может даже привести к решению проблемы ... –

+0

Спасибо, Джастин, я его модифицировал. – Jack

ответ

1

Вам необходимо переопределить как 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 
+0

Большое спасибо Джастину, я ценю подробный пример кода. Я также добавил метод hashCode(), он работает сейчас! Но я не понимаю, почему для операции «Присоединиться» нужны два метода для идентификации одного и того же ключа, только равно() недостаточно? На самом деле hashCode ничего не сделал. Почему scala/spark разрабатывают это правило? – Jack

+0

@Jack Я думаю, что важно упомянуть, что решение, которое всегда возвращает тот же «hashCode», эффективно устраняет все шансы распараллеливать вычисления по узлам. 'hashcode' используется для назначения заданного ключа разделу. 'hashCode() = 1' будет использовать один узел, так какой смысл использовать Spark? Вместо этого используйте локальное решение. – maasg

+0

@maag Это действительно имеет смысл, см. Мои комментарии ниже для вашего доброго сообщения. – Jack

1

Взлом семантику 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))) 
+0

Эй, Джерард, это потрясающе! Огромное спасибо! Мне очень нравится ваше решение! и я положил его на свой код. Еще раз спасибо! -Jack – Jack

+0

Кстати, у декартова есть небольшая проблема с производительностью, так как это соединения MxN. – Jack

+0

@Jack это по сути проблема m x n, если мы не можем каким-то образом ее ограничить. Например, если вместо подстроки мы могли бы сказать «startsWith», мы могли бы сначала присоединиться к 1-му символу. – maasg

Смежные вопросы