2014-10-23 2 views
0

k- means을 Spark과 함께 연습하고 있습니다. 이렇게하려면 각 단계에서 id -> cluster_id의 2 개지도를 비교해야합니다. 현재 나는 그 두 가지를 모으고 두 개의 평범한 스칼라지도로 비교함으로써 그것을합니다.RDD [(Int, Int)] 맵과 비교하는 방법은 무엇입니까?

병렬로 처리하는 방법이 있습니까? 그만한 가치가 있니?

는 UPDATE :

나를 시작으로, 자세한 상황을 설명하자 K-위한 수단 클러스터링 algorithim (는 간단합니다)

  1. 그들에게 무게 중심을 모든 N 지점에서 임의 K 점을 선택합니다.
  2. 재 계산 매핑을 (생성 된 경우 그
  3. 단계를 반복 2-3의 평균을 caclulating, 할당 된 무게 중심으로 모든 점을 그룹화,
  4. recalclulate의 무게 중심을 (Eucledean 거리에 따라) 가장 가까운 중심에 각 지점을 할당 obj_id -> centroid_id) 이전 단계와 다른 것

4 단계는 문제입니다. 이전 단계에서 사용한 매핑과 현재 가지고있는 매핑을 비교할 필요가 있습니다. 이는 작업자간에 무작위로 읽지 않고 병렬 처리해야합니다.

답변

1

나는 그것들을 "비교"한다는 것이 무엇을 의미하는지 확신 할 수 없습니다. 귀하의 질문에 대한 답변은 실제로 그것에 달려 있습니다! 자세한 내용을 제공 할 수 있으면 그에 대한 답변을 편집하겠습니다. 일반 질문은 일반 답변 일뿐입니다^

평등을 테스트하면 필요합니다 지도) :

val x = Map[Int, Int](1->2, 2->3) 
val y = Map[Int, Int](2->3, 1->2) 
(x == y) == true 

당신은 단지 당신이로 직접 키를 비교할 수 있습니다) 그들은 당신이 업데이트 단계의 종료를 테스트 할 어쩌면 때문에 (같은 키 세트하지만 서로 다른 매핑을 가지고 테스트하려면 이터레이터 또는 세트

(x.keys == y.keySet) == true 

매핑이 너무 커서 평등성 테스트를 병렬로 수행하려는 경우 문제가 발생하면 문제가 발생합니다. 키에 따라 쌍을 분할하고 모든 슬라이스를 병렬 검사 할 수 있습니다. 수표가 양수이면 평등합니다. 키 값/해시에 따라 x 및 y를 분할하고 다른 액터로 보내거나 (예 : 액터를 사용하는 경우) x를 반복하고 다른 액터에서 값을 확인하여이 작업을 수행 할 수 있습니다 그 키에 대해 y.

두 경우 모두, 두 맵 중 하나가 동일한 프로세스의 메모리에 있지 않아 액세스가 느리고 막히는 경우에만 의미가 있다고 생각합니다. b) 비교는 가치 평등이 아니라 비동기 파이프 라이닝의 이점을 누릴 수있는 강력한 연산이 필요합니다.

기본 제네릭 맵 구조를 사용하고 있다는 가정하에 답했습니다. 성능 제약이있는 경우 라이브러리 요구 사항이 사용자의 요구 사항에 맞도록 최적화되어 있지 않은 시나리오를 상상하기 어렵습니다.

수정 내 정보가 주어지면 내 대답은 여전히 ​​변함이 없습니다. 키의 해시에 의해 지정된 n 개의 슬라이스에서 x의 항목을 분할하고 y에 동일한 값을 가진 y가 들어 있는지 확인하십시오.

+0

몇 가지 세부 사항을 질문에 추가했습니다. –

관련 문제