私は使用する必要があります
(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
@dapangmaoの答えは機能しますが、通常のspark RDDを与えず、Rowオブジェクトを返します。通常のRDD形式を使用する場合。
これを試して:
rdd = df.rdd.map(Tuple)
または
rdd = df.rdd.map(list)
次のようなメソッド.rdd
を使用します。
rdd = df.rdd
Kennyut/Kistianによる回答は非常にうまく機能しますが、RDDが属性のリストで構成されている e.g. [1,2,3,4] flatmapコマンドは次のように使用できます。
rdd = df.rdd.flatMap(list)
or
rdd = df.rdd.flatmap(lambda x: list(x))