2013-04-03 2 views
0

플레이어 아이디가있는 게임이 있다고 가정 해 봅시다. 각 id는 여러 개의 문자 이름 (playerNames)을 가질 수 있으며 각 이름마다 점수가 있습니다. playerName 당 모든 점수를 합산하고 ID 당 플레이어 이름 당 백분율 점수를 계산하고 싶습니다.돼지 그룹 결과 내에서 루핑하기

그래서, 예를 들면 :

 
id playerName playerScore 
01 Test  45 
01 Test2  15 
02 Joe   100 

것 출력

 
id {(playerName, playerScore, percentScore)} 
01 {(Test, 45, .75), (Test2, 15, .25)} 
02 {(Joe, 100, 1.0)} 
여기

내가했던 방법 : 현재

data = LOAD 'someData.data' AS (id:int, playerName:chararray, playerScore:int); 
grouped = GROUP data BY id; 

withSummedScore = FOREACH grouped GENERATE SUM(data.playerScore) AS summedPlayerScore, FLATTEN(data); 

withPercentScore = FOREACH withSummedScore GENERATE data::id AS id, data::playerName AS playerName, (playerScore/summedPlayerScore) AS percentScore; 

percentScoreIdroup = GROUP withPercentScore By id; 

을, 나는 문에 의해 2 GROUP이 작업을 수행하고, 그들이 둘 다 필요하다면, 또는 이것을 할 수있는보다 효율적인 방법이 있는지 궁금했습니다. 이것을 단일 GROUP BY로 줄일 수 있습니까? 또는 튜플 백을 반복하고 데이터를 병합하지 않고 percentScore를 모두 추가 할 수있는 방법이 있습니까?

답변

1

아니, 당신은 2 GROUP없이이 작업을 수행 할 수 있으며, 그 이유는 돼지보다 더 근본적인 :

  1. 당신이 플레이어의 점수를 통해 선형 패스를해야 할 포인트의 총 수를 얻을 수 있습니다.
  2. 그런 다음 분수를 계산하려면 플레이어의 점수에 대해 다른 선형 패스가 필요합니다. 이 아니라면이 될 수 있습니다.

playerName의의 플레이어의 수가 적은 경우 각 GROUP 생성하기 때문에, 내가, 플레이어 점수의 가방을 받아 점수 당 PLAYERNAME 튜플의 가방을 출력하는 UDF를 써서 그런 말로 미루어 감속기 및 과정은 어리석게 천천히된다. 가방을 가져가는 UDF는 2 개의 선형 패스도 수행해야하지만, 가방이 충분히 작 으면 문제가되지 않으며 다른 감속기를 만드는 것보다 확실하게 빠르다.

+0

감사합니다. TC1에게 감사드립니다. – Newtang