¿Cómo convertir un DataFrame de nuevo a RDD normal en pyspark?

Necesito usar el

(rdd.)partitionBy(npartitions, custom_partitioner) 

Método que no está disponible en el DataFrame. Todos los métodos de DataFrame se refieren solo a los resultados de DataFrame. Entonces, ¿cómo crear un RDD a partir de los datos del DataFrame?

Nota: este es un cambio (en 1.3.0) desde 1.2.0.

Actualización de la respuesta de @dpangmao: el método es .rdd. Me interesaba entender si (a) era público y (b) cuáles son las implicaciones de rendimiento.

Bueno (a) es sí y (b) – bueno, puedes ver aquí que hay implicaciones significativas en el rendimiento : se debe crear un nuevo RDD invocando mapPartitions :

En dataframe.py (note que el nombre del archivo también cambió (era 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 

La respuesta de @dapangmao funciona, pero no le da la chispa RDD normal, devuelve un objeto Fila. Si quieres tener el formato RDD regular.

Prueba esto:

 rdd = df.rdd.map(tuple) 

o

 rdd = df.rdd.map(list) 

Usa el método .rdd así:

 rdd = df.rdd 

La respuesta dada por kennyut / Kistian funciona muy bien, pero para obtener un RDD exacto como resultado cuando RDD consiste en una lista de atributos, por ejemplo [1,2,3,4], podemos usar el comando flatmap como se muestra a continuación,

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