web-dev-qa-db-ja.com

pyspark: 'PipelinedRDD'オブジェクトは反復可能ではありません

このエラーが発生しますが、理由がわかりません。基本的に私はこのコードからエラーを出している:

    a = data.mapPartitions(helper(locations))

ここで、データはRDDであり、私のヘルパーは次のように定義されています。

    def helper(iterator, locations): 
        for x in iterator:
            c = locations[x]
            yield c

(場所は単なるデータポイントの配列です)問題が何であるかはわかりませんが、私はpysparkが得意ではないので、「PipelinedRDD」オブジェクトがこのコードから反復できない理由を誰かに教えてもらえますか?

5
deeformvp

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`
1