web-dev-qa-db-ja.com

pysparkでDataFrameを通常のRDDに戻す方法は?

私は使用する必要があります

(rdd.)partitionBy(npartitions, custom_partitioner)

dataFrameで使用できないメソッド。すべてのDataFrameメソッドは、DataFrameの結果のみを参照します。それでは、DataFrameデータからRDDを作成する方法は?

注:これは、1.2.0からの変更(1.3.0)です。

更新 @dpangmaoからの回答:メソッドは.rddです。 (a)公開されているか、(b)パフォーマンスにどのような影響があるかを理解することに興味がありました。

よく(a)ははい、(b)-ここで重要なパフォーマンスへの影響があることがわかります:新しいRDDはmapPartitionsを呼び出して作成する必要があります:

dataframe.py(ファイル名も変更されていることに注意してください(sql.pyでした):

@property
def rdd(self):
    """
    Return the content of the :class:`DataFrame` as an :class:`RDD`
    of :class:`Row` s.
    """
    if not hasattr(self, '_lazy_rdd'):
        jrdd = self._jdf.javaToPython()
        rdd = RDD(jrdd, self.sql_ctx._sc, BatchedSerializer(PickleSerializer()))
        schema = self.schema

        def applySchema(it):
            cls = _create_cls(schema)
            return itertools.imap(cls, it)

        self._lazy_rdd = rdd.mapPartitions(applySchema)

    return self._lazy_rdd
48
javadba

@dapangmaoの答えは機能しますが、通常のspark RDDを与えず、Rowオブジェクトを返します。通常のRDD形式を使用する場合。

これを試して:

rdd = df.rdd.map(Tuple)

または

rdd = df.rdd.map(list)
56
kennyut

次のようなメソッド.rddを使用します。

rdd = df.rdd
91
dapangmao

Kennyut/Kistianによる回答は非常にうまく機能しますが、RDDが属性のリストで構成されている e.g. [1,2,3,4] flatmapコマンドは次のように使用できます。

rdd = df.rdd.flatMap(list)
or 
rdd = df.rdd.flatmap(lambda x: list(x))
4
Nilesh