1.DataFrame与RDD互操作方式一:反射方式
(1)使用反射来推断包含了特定数据类型的RDD的元数据
(2)使用DataFrame API或者sql方式编程
//添加隐式转换
import spark.implicits._
val spark = SparkSession.builder().appName("xxx").master("local[2]").getOrCreate()
//创建一个RDD
val rdd = spark.sparkContext.textFile("xxx")
//转换为DF
val peopleDF = rdd.map(_.split(",")).map(line => Info(line(0).toInt,line(1),line(2).toInt)).toDF()
case class Info(id: Int, name: String, age: Int)
2.编程方式
使用编程接口,构造一个schema并将其应用在已知的RDD上。
val spark = SparkSession.builder().appName("xxx").master("local[2]").getOrCreate()
//创建一个RDD
val rdd = spark.sparkContext.textFile("xxx")
//转换RDD的record为Row
val infoRDD = rdd.map(_.split(",").map(line => Row(line(0).toInt, line(1),line(2).toInt))
//创建一个schema
val structType = StructType(Array(StructField("id",IntergerType,true),StructField("name",StringType,true),StructField("age",IntergerType,true)))
//将schema应用于RDD
val infoDF = spark.createDataFrame(infoRDD,structType)
DataFrame和RDD互操作的两种方式
1)反射:case class 前提:事先知道你的字段、字段类型
2)编程:Row 事先不知道列
3)选型:优先第一种