特定のパラメーターに従ってグループに分割する必要がある大きなデータセットがあります。ジョブをできるだけ効率的に処理したい。そうするための2つの方法を想像することができます
オプション1-元のRDDからマップを作成してフィルターする
def customMapper(record):
if passesSomeTest(record):
return (1,record)
else:
return (0,record)
mappedRdd = rddIn.map(lambda x: customMapper(x))
rdd0 = mappedRdd.filter(lambda x: x[0]==0).cache()
rdd1 = mappedRdd.filter(lambda x: x[1]==1).cache()
オプション2-元のRDDを直接フィルターする
def customFilter(record):
return passesSomeTest(record)
rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()
fistメソッドは、元のデータセットのすべてのレコードを3回テストする必要がありますが、2番目は通常の状況では2回のみ行う必要がありますが、sparkはシーンのグラフ作成の背後でいくらか実行するので、効果的に同じ方法で行われます。私の質問は次のとおりです:a。)1つの方法が他の方法より効率的であるか、またはスパークグラフの構築によってそれらが同等になるかb。)この分割を単一のパスで実行することは可能ですか