Apache Spark:如何将Spark DataFrame转换为类型为RDD [(Type1,Type2,...)]的RDD?

问题描述:

例如,假设我有数据帧:Apache Spark:如何将Spark DataFrame转换为类型为RDD [(Type1,Type2,...)]的RDD?

var myDF = sc.parallelize(Seq(("one",1),("two",2),("three",3))).toDF("a", "b") 

我可以用地图将其转换为RDD[(String, Int)]

var myRDD = myDF.map(r => (r(0).asInstanceOf[String], r(1).asInstanceOf[Int])) 

有没有更好的方式来做到这一点,也许使用DF模式?

使用模式匹配在:

import org.apache.spark.sql.Row 

myDF.map{case Row(a: String, b: Int) => (a, b)} 

火花1.6+可以使用Dataset如下:

myDF.as[(String, Int)].rdd 
+2

哦,那'as'功能完善。 –

+0

所以你的模式匹配'行'比我的'asInstanceOf'地图更快或更安全?还是它归结为一个相当类似的操作,语法更清晰? –

+0

第二种选择我很害怕。对于静态类型来说,'Row'(和'DataFrame'一般)相当烦人。使用'数据集'应该更有效率,特别是如果你不转换为RDD。 – zero323