分别用反射、编程接口的方式创建DataFrame
1、通过反射的方式 使用反射来推断包含特定数据类型的RDD,这种方式代码比较少,简洁,只要你会知道元数据信息时什么样,就可以使用了
代码如下:
import org.apache.spark.sql.{SQLContext, SaveMode} import org.apache.spark.{SparkConf, SparkContext} object RDD2DataFrame { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("DF").setMaster("local") val sc = new SparkContext(conf) val sQLContext = new SQLContext(sc) //创建一个普通的RDD val rdd = sc.textFile("D:\\data\\spark\\students.txt") var rdd2= rdd.map(t=>{ val lines = t.split(",") studented(lines(0).toInt,lines(1),lines(2).toInt) }) //注意:需要导入隐式转换 import sQLContext.implicits._ val df = rdd2.toDF() //注册临时表 df.registerTempTable("student") val dfs = sQLContext.sql("select name from student where age>18") dfs.write.mode(SaveMode.Append).text("D:\\result\\Rdd2DataFrame") } } case class studented(id:Int,name:String,age:Int)
2、通过编程接口的方式 你可以自己动态的构建一份元数据,这种代码比较多,但是适合你不知道元数据的时候使用,一般都用这种方式
代码如下:
object RDD2DataFrame2 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("df02").setMaster("local") val sc = new SparkContext(conf) val sqlContext = new SQLContext(sc) //val df = sqlContext.read.json("D:\\data\\spark\\students.json") val rdd = sc.textFile("D:\\data\\spark\\students.txt") val rowRdd = rdd.map(t => { val str = t.split(",") Row(str(0).toInt, str(1), str(2).toInt) }) //构建StructType val structType = StructType(Array(StructField("id", IntegerType, true), StructField("name", StringType, true), StructField("age", IntegerType, true) )) //创建DataFrame val df: DataFrame = sqlContext.createDataFrame(rowRdd,structType) df.registerTempTable("stu") val sql = sqlContext.sql("select * from stu where age>17") sql.rdd.foreach(println) } }