web-dev-qa-db-fra.com

Comment reconvertir un DataFrame en RDD normal dans pyspark?

J'ai besoin d'utiliser le

(rdd.)partitionBy(npartitions, custom_partitioner)

méthode qui n'est pas disponible sur le DataFrame. Toutes les méthodes DataFrame font uniquement référence aux résultats DataFrame. Alors, comment créer un RDD à partir des données DataFrame?

Remarque: ceci est une modification (dans 1.3.0) de 1.2.0.

Mise à jour de la réponse de @dpangmao: la méthode est .rdd. Je voulais savoir si (a) c'était public et (b) quelles sont les implications pour la performance.

Eh bien (a) est oui et (b) - eh bien, vous pouvez voir ici qu’il ya des implications importantes pour la performance: un nouveau RDD doit être créé en appelant mapPartitions:

Dans dataframe.py (notez que le nom du fichier a également changé (était 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
48
javadba

La réponse de @ dapangmao fonctionne, mais elle ne donne pas le RDD standard spark), elle retourne un objet Row. Si vous voulez avoir le format RDD normal.

Essaye ça:

rdd = df.rdd.map(Tuple)

ou

rdd = df.rdd.map(list)
56
kennyut

Utilisez la méthode .rdd comme ça:

rdd = df.rdd
91
dapangmao

La réponse donnée par kennyut/Kistian fonctionne très bien, mais pour obtenir un résultat identique à celui d'un RDD quand le RDD consiste en une liste d'attributs p. Ex. [1,2,3,4] nous pouvons utiliser la commande flatmap comme ci-dessous,

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