Python 如何在pyspark中将数据帧转换回普通RDD?

Python 如何在pyspark中将数据帧转换回普通RDD?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我需要使用 (rdd.)partitionBy(npartitions, custom_partitioner) 方法,该方法在数据帧上不可用。所有DataFrame方法都只引用DataFrame结果。那么,如何从数据帧数据创建RDD呢 注:这是对1.2.0的更改(在1.3.0中) 根据@dpangmao的答案更新:方法是.rdd。我有兴趣了解(a)它是否是公开的,以及(b)它对性能的影响是什么 (a)是肯定的,(b)-您可以在这里看到有显著的性能影响:必须通过调用映射分区来创建新的RDD:

我需要使用

(rdd.)partitionBy(npartitions, custom_partitioner)
方法,该方法在数据帧上不可用。所有DataFrame方法都只引用DataFrame结果。那么,如何从数据帧数据创建RDD呢

注:这是对1.2.0的更改(在1.3.0中)

根据@dpangmao的答案更新:方法是.rdd。我有兴趣了解(a)它是否是公开的,以及(b)它对性能的影响是什么

(a)是肯定的,(b)-您可以在这里看到有显著的性能影响:必须通过调用映射分区来创建新的RDD:

dataframe.py中(注意文件名也发生了更改(是sql.py):


使用如下方法
.rdd

rdd = df.rdd

@dapangmao的答案是可行的,但是它没有给出常规的spark RDD,它返回一个Row对象

试试这个:

rdd = df.rdd.map(tuple)


kennyut/Kistian给出的答案非常有效,但要在RDD由属性列表组成时获得类似RDD的精确输出,例如[1,2,3,4],我们可以使用以下flatmap命令

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

是的,你是对的。我在深入研究后更新了OP。是的,但它转换为org.apache.spark.rdd.rdd[org.apache.spark.sql.Row],而不是org.apache.spark.rdd.rdd[string]从技术上讲,它是一个属性:在调用
df.rdd
时,这应该是imo的默认行为。这可能是一个更精确的答案。实际上,
df
是什么,如何初始化它?@DavidWei是一个数据帧实例,所以无论您的数据帧被分配给什么变量,元组和列表?这看起来是一个有用的贡献。
rdd = df.rdd.map(list)
rdd = df.rdd.flatMap(list)
or 
rdd = df.rdd.flatmap(lambda x: list(x))