2017-09-15 5 views
0

私は、次のようなSparkのキー値のペアを持っているとします。Pyspark(key、value)の対と(key、[値のリスト])の対

[ (Key1, Value1), (Key1, Value2), (Key1, Vaue3), (Key2, Value4), (Key2, Value5) ] 

ここでは、これを減らしたいと考えています。

[ (Key1, [Value1, Value2, Value3]), (Key2, [Value4, Value5]) ] 

つまり、Key-ValueからKey-List of Valuesです。

マップを使用してこれを行うにはどうしたらいいですか?

+3

私は、これはあなたが探しているものであると信じて:https://stackoverflow.com/a/27002657/8160718 –

答えて

-1

もちろん、mapreduceで行うことは可能ですが、確かに難読化の練習になるでしょう。反復的にそれをやっては簡単です:

lists={}  # key -> list of values 
output=[] 
for k,v in input: 
    l=lists.get(k) 
    if l is None: 
    l=lists[k]=[] 
    output.append((k,l)) # empty for now 
    l.append(v) 

注意事項(それだけで単一の例からの要求を取得するのは難しいので):

  1. これは、キーがhashableであることを前提としています。
  2. [(k1,v1),(k2,v2),(k1,v3)]などのリストをサポートしています。すべての​​ペアが隣接しているわけではありません。
  3. 最初に登場する順にキーをoutputのリストに入れます。
  4. キーに表示される順序ですべての値(重複を含む)を置きます。
+0

あなたはすべてを反復処理されますので、このコードは、キーと値のペアの数が多いために良いではありませんそれら。 –

+0

私は 'pyspark'の専門家ではありません。アルゴリズムは[online](https://en.wikipedia.org/wiki/Online_algorithm)という要件を前提としていますか? (Python 2では、 'map'と' reduce'はこれを行うことができません!)もしそうなら、単一のキーを持つすべてのペアが連続していると仮定できますか? –

+2

私は失礼ではありませんでした。私が言っていたことは、Sparkに関連する問題を考えるとき、データセットはしばしば大きく、上で書いたコードを実行するときには、masterノードがすべてをメモリにロードする必要があるようにcollect()を呼び出す必要があります。実行可能ではありません。 OPはPysparkで 'map'と' reduce'を意味し、Pythonでは使われませんでした。 –

関連する問題