Scala 如何将数据帧转换为RDD和don';不改变分区?

Scala 如何将数据帧转换为RDD和don';不改变分区?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,出于某种原因,我必须将RDD转换为dataframe,然后对dataframe执行一些操作,但我的接口是RDD,因此我必须将dataframe转换为RDD,当我使用df.RDD时,分区更改为1,所以我必须重新分区和排序RDD,有没有更干净的解决方案?谢谢! 这是我的尝试: val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4) val partition=rdd.getNumPartitions val sqlContext = n

出于某种原因,我必须将
RDD
转换为
dataframe
,然后对
dataframe
执行一些操作,但我的接口是
RDD
,因此我必须将
dataframe
转换为
RDD
,当我使用
df.RDD
时,分区更改为1,所以我必须
重新分区
排序
RDD,有没有更干净的解决方案?谢谢! 这是我的尝试:

    val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4)
    val partition=rdd.getNumPartitions
    val sqlContext = new SQLContext(m_sparkCtx)
    import sqlContext.implicits._
    val df=rdd.toDF()
    df.rdd.zipWithIndex().sortBy(x => {x._2}, true, partition).map(x => {x._1})

将数据帧转换为RDD时,分区应保持不变。 例如,当4个分区的rdd转换为DF并返回rdd时,rdd的分区保持如下所示

scala> val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[11] at parallelize at <console>:27

scala> val partition=rdd.getNumPartitions
partition: Int = 4

scala> val df=rdd.toDF()
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.rdd.getNumPartitions
res1: Int = 4

scala> df.withColumn("col2", lit(10)).rdd.getNumPartitions
res1: Int = 4
scala>val-rdd=sc.parallelize(列表(1,3,2,4,5,6,7,8),4)
rdd:org.apache.spark.rdd.rdd[Int]=ParallelCollectionRDD[11]位于parallelize at:27
scala>val partition=rdd.getNumPartitions
分区:Int=4
scala>val df=rdd.toDF()
df:org.apache.spark.sql.DataFrame=[value:int]
scala>df.rdd.getNumPartitions
res1:Int=4
scala>df.withColumn(“col2”,lit(10)).rdd.getNumPartitions
res1:Int=4

将数据帧转换为RDD时,分区应保持不变。 例如,当4个分区的rdd转换为DF并返回rdd时,rdd的分区保持如下所示

scala> val rdd=sc.parallelize(List(1,3,2,4,5,6,7,8),4)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[11] at parallelize at <console>:27

scala> val partition=rdd.getNumPartitions
partition: Int = 4

scala> val df=rdd.toDF()
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.rdd.getNumPartitions
res1: Int = 4

scala> df.withColumn("col2", lit(10)).rdd.getNumPartitions
res1: Int = 4
scala>val-rdd=sc.parallelize(列表(1,3,2,4,5,6,7,8),4)
rdd:org.apache.spark.rdd.rdd[Int]=ParallelCollectionRDD[11]位于parallelize at:27
scala>val partition=rdd.getNumPartitions
分区:Int=4
scala>val df=rdd.toDF()
df:org.apache.spark.sql.DataFrame=[value:int]
scala>df.rdd.getNumPartitions
res1:Int=4
scala>df.withColumn(“col2”,lit(10)).rdd.getNumPartitions
res1:Int=4

ok,df.withColumn函数可能会将分区更改为1,有没有更干净的解决方案?如果您接受了答案,您能否详细说明“df.withColumn函数可能会将分区更改为1”?@mentongwu
df.withColumn
也不应该更改分区的数量。查看更新后的答案。好的,df.withColumn函数可能会将分区更改为1,有没有更干净的解决方案?如果您接受了答案,您可以详细说明“df.withColumn函数可能会将分区更改为1”吗?@mentongwu
df.withColumn
也不应该更改分区的数量。请参阅更新的答案。