python - 如何在pyspark中将DataFrame转换回普通RDD?

我需要使用

(rdd.)partitionBy(npartitions, custom_partitioner)

数据帧上不可用的方法。所有的数据帧方法都只引用数据帧结果。那么如何从数据帧数据创建RDD呢?
注意:这是从1.2.0更改(在1.3.0中)。
从@dpangmao的答案更新:方法是.rdd。我有兴趣了解(a)它是否公开,(b)性能影响是什么。
好吧(a)是肯定的,(b)-好吧,你可以在这里看到有显著的性能影响:必须通过调用mapparties来创建一个新的RDD:
在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


最佳答案:

@大邦茂的答案是有效的,但它没有给出常规的spark RDD,而是返回一个row对象。如果您想要常规的RDD格式。
试试这个:

rdd = df.rdd.map(tuple)


rdd = df.rdd.map(list)