Spark官网提供了两种方法来实现从RDD转换得到DataFrame,第一种方法是,利用反射来推断包含特定类型对象的RDD的schema;第二种方法是,使用编程接口,构造一个schema并将其应用在已知的RDD上。
利用反射机制推断RDD模式
在利用反射机制推断RDD模式时,需要首先定义一个case class,因为,只有case class才能被Spark隐式地转换为DataFrame。
下面是在spark-shell中执行命令以及反馈的信息:
- scala> import org.apache.spark.sql.SQLContext
- scala> val sqlContext = new SQLContext(sc)
- scala> import sqlContext.implicits._ //导入包,支持把一个RDD隐式转换为一个DataFrame
- import sqlContext.implicits._
- scala> case class Person(name: String, age: Int) //定义一个case class
- defined class Person
- scala> val people = sc.textFile("file:///usr/local/spark/examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
- 16/11/15 11:19:18 INFO spark.SparkContext: Created broadcast 17 from textFile at <console>:37
- people: org.apache.spark.sql.DataFrame = [name: string, age: int]
- scala> people.registerTempTable("peopleTempTab") //必须注册为临时表才能供下面的查询使用
- scala> val personsRDD = sqlContext.sql("select name,age from peopleTempTab where age > 20").rdd //最终生成一个RDD
- personsRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[43] at rdd at &