10

次の形式の通話レコードの行があるとします。

[CallingUser, ReceivingUser, Duration]

特定のユーザーが電話に出ていた合計時間 (ユーザーが CallingUser または RecomingUser であった期間の合計) を知りたい場合。

(CallingUser, Duration)事実上、特定のレコードに対して、2 つのペアとを作成したいと考えています(ReceivingUser, Duration)

これを行う最も効率的な方法は何ですか? 2つを追加できRDDsますが、これが良いアプローチであるかどうかは不明です:

#Sample Data:
callData = sc.parallelize([["User1", "User2", 2], ["User1", "User3", 4], ["User2", "User1", 8]  ])


calls = callData.map(lambda record: (record[0], record[2]))

#The potentially inefficient map in question:
calls += callData.map(lambda record: (record[1], record[2]))


reduce = calls.reduceByKey(lambda a, b: a + b)
4

2 に答える 2

11

フラットマップが欲しい。リストを返す関数を作成すると、[(record[0], record[2]),(record[1],record[2])]それをフラット マップできます。

于 2015-02-27T07:15:46.557 に答える
8

単一の入力を取り、複数のマップされた出力を生成するのに適した flatMap() を使用します。コードを完成させます:

callData = sc.parallelize([["User1", "User2", 2], ["User1", "User3", 4], ["User2", "User1", 8]])

calls = callData.flatMap(lambda record: [(record[0], record[2]), (record[1], record[2])])
print calls.collect()
# prints [('User1', 2), ('User2', 2), ('User1', 4), ('User3', 4), ('User2', 8), ('User1', 8)]

reduce = calls.reduceByKey(lambda a, b: a + b)
print reduce.collect()
# prints [('User2', 10), ('User3', 4), ('User1', 14)]
于 2015-06-09T04:44:41.437 に答える