Подтвердить что ты не робот

Как преобразовать DataFrame в обычный RDD в pyspark?

Мне нужно использовать

(rdd.)partitionBy(npartitions, custom_partitioner)

который недоступен в DataFrame. Все методы DataFrame относятся только к результатам DataFrame. Итак, как создать RDD из данных DataFrame?

Примечание: это изменение (в 1.3.0) с 1.2.0.

Обновить из ответа @dpangmao: метод .rdd. Мне было интересно понять, если (а) она была общедоступной и (б) каковы последствия для производительности.

Хорошо (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
4b9b3361

Ответ 1

Используйте метод .rdd следующим образом:

rdd = df.rdd

Ответ 2

@dapangmao отвечает, но он не дает регулярную искру RDD, он возвращает объект Row. Если вы хотите иметь обычный формат RDD.

Попробуйте следующее:

rdd = df.rdd.map(tuple)

или

rdd = df.rdd.map(list)