2014-07-17 4 views
1

3 개의 필드가있는 RichPipe가 있습니다. name : String, time : Long 및 value : Int. 특정 이름, 시간 쌍에 대한 값을 가져와야합니다. 내가 어떻게 해? 나는 그것이 매우 비밀스럽고 이것을하는 어떤 예제도 찾을 수 없기 때문에 문서를 긁어서 알 수 없다.RichPipe에서 값 가져 오기

답변

3

글쎄 RichPipe은 키 - 값 저장소가 아니기 때문에 키 - 값 저장소로 사용하는 데 대한 문서가 없습니다. RichPipe은 파이프로 간주되어야하므로 데이터를 가져올 수 없습니다. 처음에는 한쪽 끝으로 들어 가지 않고 파이프를 횡단하여 중간을 찾았습니다. 또한 Scalding에서는 디스크에 결과를 기록해야하므로 (Hadoop 위에 구현되어 있기 때문에) 응용 프로그램에서 사용하기 위해 디스크에서 결과를 읽어야하기 때문에 Scalding에는 다소 고통 스럽습니다. 코드는 다음과 같습니다 :

myPipe.filter[String, Long](('name, 'time))(_ == (specificName, specificTime)) 
.write(Tsv("tmp/location")) 

그러면 작업을 실행하고 결과를 얻기 위해 데이터를 메모리로 다시 읽으려면 더 높은 수준의 코드가 필요합니다. 이 작업을 수행하는 데 필요한 모든 코드를 작성하는 대신 (매우 간단합니다.) 유스 케이스가 무엇인지, 무엇을하려고하는지에 대해 더 자세히 설명하지 않는 것이 좋습니다. 아마도지도 감소 도구로 문제를 해결할 수 있습니다 프로그래밍 모델.

또는 Spark을 사용하면 분산 데이터 세트를 트래버스해야하는 것과 동일한 문제가 발생하지만 디스크에 쓰기 및 다시 읽는 방법은 없습니다. 또한 Spark는 맞춤형 파티셔를 사용하여 동작과 유사한 키 - 값 저장소를 생성 할 수 있습니다. 그러나 어쨌든 순진하게 코드는 다음과 같습니다.

val theValueYouWant = 
    myRDD.filter { 
    case (`specificName`, `specificTime`, _) => true 
    case _ => false 
    } 
    .toArray.head._3 
+0

필드가있는 여러 개의 파이프가 있습니다. name : String, time : Long, value : Int. 시간은 서로 다른 세분성을 갖습니다 : 1h, 2h, 4h 등등. 해당 시간의 모든 이름 - 시간 쌍에 대한 값을 찾아 모든 시간에서 최대 값을 얻어야합니다. 따라서 4h 단위의 하나의 리치 파이프에는 하나의 값이 있고 해당 1h 및 4h 파이프에는 각각 4와 2 값이 있습니다. RichPipes에서 최대 값을 얻은 후 시간과 밀리 초 단위로 이름과 시간을 가진 다른 리치 파이프에 추가하도록 할당해야합니다. 나는 조인을 사용하려고 생각했다. –

+0

... 조인을 사용하려고 생각했지만 값을 직접 비교하지 않고 조인하는 방법을 알아낼 수는 없지만 함수를 사용하고 조인하는 동안 최대 값을 얻는 방법도 있습니다. 나는 당신이 말한 바로 직후에 값을 얻지 않으려 고 생각했습니다 :) –

+0

행을 여러 키 (키로 1h 단위)로 복제하면 조인을 수행하고 원하는 것을 할 수 있습니다. 예를 들어 시간 4, 5, 6, 6이'(3 (a, b, c)), (4, (a, b, c) c)), (5, (a, b, c)), (6, (a, b, c))'그런 다음 그것을 평평하게하고 1h 키에 조인을 수행하십시오. 이 코멘트에서 아이디어를 얻지 못하면 새로운 질문을 올리고 더 정확한 답변을 드리겠습니다. – samthebest