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

6
例如,假设我有以下DataFrame:
var myDF = sc.parallelize(Seq(("one",1),("two",2),("three",3))).toDF("a", "b")

我可以通过map方法将其转换为RDD[(String, Int)]

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

有没有更好的方法来处理这个问题?也许可以使用DF模式吗?
1个回答

12

使用模式匹配来匹配 Row

import org.apache.spark.sql.Row

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

在Spark 1.6+中,您可以按以下方式使用Dataset

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

3
哦,那个as函数非常完美。 - evan.oman
那么,您对Row的模式匹配是否比我的asInstanceOf映射更快或更安全?还是说这归结为一种相当类似的操作,只是语法更清晰? - evan.oman
我害怕第二个选项。当涉及到静态类型时,Row(以及一般的DataFrame)非常令人讨厌。使用Dataset应该更有效率,特别是如果你不转换为RDD。 - zero323
好的。还有没有一种方法可以使用DF模式来确定结果元组中应该有哪些类型?所有必要的信息都存储在DF中,因此再次指定类型似乎有些混乱。 - evan.oman
我此刻能想到的最接近的事情是对模式进行映射。 - zero323
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接