ラーニングSpark本を読んでいて、次のペアのrdd変換を理解できませんでした。
_rdd.flatMapValues(x => (x to 5))
_
これはrdd {(1,2),(3,4),(3,6)}
に適用され、変換の出力は{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
です。
誰かがこれを説明できますか?.
flatMapValues
メソッドは、flatMap
とmapValues
を組み合わせたものです。
与えられたrddから始めましょう。
_val sampleRDD = sc.parallelize(Array((1,2),(3,4),(3,6)))
_
mapValues
は、キーを保持しながら値をマッピングします。
たとえば、sampleRDD.mapValues(x => x to 5)
は
_Array((1,Range(2, 3, 4, 5)), (3,Range(4, 5)), (3,Range()))
_
キーと値のペア_(3, 6)
_の場合、_(3,Range())
_は空の値のコレクションを生成するため、これは_6 to 5
_を生成することに注意してください。
flatMap
コレクションをコレクションの要素に「分解」します。 here および here のように、flatMapのより正確な説明をオンラインで検索できます。
例えば、
val rdd2 = sampleRDD.mapValues(x => x to 5)
を指定すると、rdd2.flatMap(x => x)
を実行すると、
_Array((1,2),(1,3),(1,4),(1,5),(3,4),(3,5)).
_
つまり、各キーのコレクション内のすべての要素に対して、_(key, element)
_ペアを作成します。
また、シーケンスが空であるため、_(3, Range())
_は追加のキー要素ペアを生成しないことに注意してください。
flatMap
とmapValues
を組み合わせると、flatMapValues
になります。
flatMapValuesは、キーに関連付けられた各値で機能します。上記の場合、_x to 5
_は、各値が5まで増分されることを意味します。
_(1,2)
_がある最初のペアを取得すると、ここでキーは1で値は2になるため、変換を適用すると{(1,2),(1,3),(1,4),(1,5)}
になります。
お役に立てれば。