このエラーが発生しますが、理由がわかりません。基本的に私はこのコードからエラーを出している:
a = data.mapPartitions(helper(locations))
ここで、データはRDDであり、私のヘルパーは次のように定義されています。
def helper(iterator, locations):
for x in iterator:
c = locations[x]
yield c
(場所は単なるデータポイントの配列です)問題が何であるかはわかりませんが、私はpysparkが得意ではないので、「PipelinedRDD」オブジェクトがこのコードから反復できない理由を誰かに教えてもらえますか?
RDDは、マップ関数とラムダ関数を使用して繰り返すことができます。以下の方法を使用してパイプラインRDDを繰り返しました
lines1 = sc.textFile("\..\file1.csv")
lines2 = sc.textFile("\..\file2.csv")
pairs1 = lines1.map(lambda s: (int(s), 'file1'))
pairs2 = lines2.map(lambda s: (int(s), 'file2'))
pair_result = pairs1.union(pairs2)
pair_result.reduceByKey(lambda a, b: a + ','+ b)
result = pair.map(lambda l: Tuple(l[:1]) + Tuple(l[1].split(',')))
result_ll = [list(elem) for elem in result]
===> result_ll = [結果のelemのlist(elem)]
TypeError: 'PipelinedRDD'オブジェクトは反復可能ではありません
これの代わりに、map関数を使用して反復を置き換えました
result_ll = result.map( lambda elem: list(elem))
これがそれに応じてコードを変更するのに役立つことを願っています
私は以下のリンクで別の質問で言った答えを好みます: pysparkのPipelined Rddにアクセスできません
RDDを反復処理することはできません。最初にアクションを呼び出して、データをドライバーに戻す必要があります。クイックサンプル:
`>>> test = sc.parallelize([1,2,3])
>>> for i in test:
... print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'RDD' object is not iterable`
ただし、たとえば、「。collect()」を使用できます。
`>>> for i in test.collect():
... print i
1
2
3`