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

时间:2015-03-12 01:36:31

标签: python apache-spark pyspark

我需要使用

(rdd.)partitionBy(npartitions, custom_partitioner)

DataFrame上没有的方法。所有DataFrame方法仅引用DataFrame结果。那么如何从DataFrame数据创建RDD?

注意:这是从1.2.0开始的更改(在1.3.0中)。

来自@dpangmao的答案

更新:方法是.rdd。我有兴趣了解(a)它是否公开以及(b)性能影响是什么。

嗯(a)是肯定的,(b) - 你可以在这里看到有重要的性能影响:必须通过调用 mapPartitions 创建一个新的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

3 个答案:

答案 0 :(得分:89)

使用方法.rdd,如下所示:

rdd = df.rdd

答案 1 :(得分:55)

@ dapangmao的答案有效,但它没有给出常规的火花RDD,它返回一个Row对象。如果你想拥有常规的RDD格式。

试试这个:

rdd = df.rdd.map(tuple)

rdd = df.rdd.map(list)

答案 2 :(得分:4)

Answer given by kennyut/Kistian works very well but to get exact RDD like output when RDD consist of list of attributes e.g. [1,2,3,4] we can use flatmap command as below,

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