在DataFrame上执行RDD操作

时间:2016-12-14 07:41:13

标签: apache-spark dataframe apache-spark-sql spark-dataframe rdd

我有10个字段的数据集。我需要在这些DataFrame上执行RDD操作。是否可以执行诸如mapflatMap等的RDD操作。

这是我的示例代码:

df.select("COUNTY","VEHICLES").show();

这是我的dataframe,我需要将此dataframe转换为RDD,并在此新RDD上运行一些RDD操作。

以下是我将数据帧转换为RDD的代码

 RDD<Row> java = df.select("COUNTY","VEHICLES").rdd();

转换为RDD后,我无法看到RDD结果,我试过

java.collect();
java.take(10);
java.foreach();

在上述所有情况下,我都没有得到结果。

请帮帮我。

4 个答案:

答案 0 :(得分:0)

val myRdd : RDD[String] = ds.rdd

查看Spark Api文档Dataset to RDDlazy val rdd: RDD[T]

在您的情况下,通过在调用.rdd之后执行select来创建具有所选记录的Dataframe,它将把它转换为RDD

答案 1 :(得分:0)

对于Spark 1.6:

您无法看到结果,就像您将Dataframe转换为RDD一样,它将其转换为RDD[Row]

因此当你尝试其中任何一个时:

java.collect();
java.take(10);
java.foreach();

这将导致Array[Row]并且您无法获得结果。

<强>解决方案:

您可以将行转换为相应的值,并从中获取RDD,如下所示:

val newDF=df.select("COUNTY","VEHICLES")
val resultantRDD=newDF.rdd.map{row=>
val county=row.getAs[String]("COUNTY")
val vehicles=row.getAs[String]("VEHICLES")
(county,vehicles)
}

现在,您可以应用foreachcollect函数来获取值。

P.S。:代码是用Scala编写的,但是你可以了解我想要做的事情的本质!

答案 2 :(得分:0)

从spark 2.0开始,您可以使用toDS函数将DataFrame转换为DataSet,以便使用RDD操作。
关于掌握spark 2.0

,推荐这个伟大的article

答案 3 :(得分:0)

Try persisting the rdd before reading the data from rdd.

val finalRdd = mbnfinal.rdd
finalRdd.cache()
finalRdd.count()