如何在 pyspark 中将 DataFrame 转换回正常的 RDD?
How to convert a DataFrame back to normal RDD in pyspark?
我需要使用
(rdd.)partitionBy(npartitions, custom_partitioner)
DataFrame 上不可用的方法。所有 DataFrame 方法仅引用 DataFrame 结果。那么如何从DataFrame数据创建一个RDD呢?
注意:这是对 1.2.0 的更改(在 1.3.0 中)。
Update 来自@dpangmao的回答:方法是.rdd。我有兴趣了解 (a) 它是否 public 和 (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
像这样使用方法.rdd
:
rdd = df.rdd
@dapangmao 的答案有效,但它没有给出常规的 spark RDD,它 returns 一个 Row 对象。如果你想要常规的RDD格式。
试试这个:
rdd = df.rdd.map(tuple)
或
rdd = df.rdd.map(list)
kennyut/Kistian 给出的答案非常有效,但是当 RDD 包含属性列表 时,要获得精确的 RDD 输出,例如[1,2,3,4] 我们可以使用 flatmap 命令如下,
rdd = df.rdd.flatMap(list)
or
rdd = df.rdd.flatmap(lambda x: list(x))
我需要使用
(rdd.)partitionBy(npartitions, custom_partitioner)
DataFrame 上不可用的方法。所有 DataFrame 方法仅引用 DataFrame 结果。那么如何从DataFrame数据创建一个RDD呢?
注意:这是对 1.2.0 的更改(在 1.3.0 中)。
Update 来自@dpangmao的回答:方法是.rdd。我有兴趣了解 (a) 它是否 public 和 (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
像这样使用方法.rdd
:
rdd = df.rdd
@dapangmao 的答案有效,但它没有给出常规的 spark RDD,它 returns 一个 Row 对象。如果你想要常规的RDD格式。
试试这个:
rdd = df.rdd.map(tuple)
或
rdd = df.rdd.map(list)
kennyut/Kistian 给出的答案非常有效,但是当 RDD 包含属性列表 时,要获得精确的 RDD 输出,例如[1,2,3,4] 我们可以使用 flatmap 命令如下,
rdd = df.rdd.flatMap(list)
or
rdd = df.rdd.flatmap(lambda x: list(x))