假设我有一个带有玩家 ID 的游戏。每个 id 可以有多个角色名称(playerNames),我们对每个名称都有一个分数。我想将每个 playerName 的所有分数加起来,并计算每个 id 每个玩家名称的百分比分数。
因此,例如:
id playerName playerScore 01 测试 45 01 测试2 15 02乔100
会输出
id {(playerName, playerScore, percentScore)} 01 {(Test, 45, .75), (Test2, 15, .25)} 02 {(乔, 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 BY 语句来执行此操作,我很好奇它们是否都是必要的,或者是否有更有效的方法来执行此操作。我可以将其减少为单个 GROUP BY 吗?或者,有没有一种方法可以遍历元组包并向所有元组添加 percentScore 而不会展平数据?