1、 SparkSession
是SQLContext和HiveContext的组合; 为了向后兼容,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。
SparkSession内部封装了sparkContext、SparkConf、SQLContext,所以计算实际上是由sparkContext完成的。
---- 为用户提供一个统一的切入点使用Spark 各项功能
---- 允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写程序
--- 与 Spark 交互之时不需要显示的创建 SparkConf, SparkContext 以及 SQlContext,这些对象已经封闭在 SparkSession 中
2、创建DataFrame的方式
方式一:sparkSQL之数据源读取parquet、json、csv案例。
方式二:通过 structType 创建 DataFrames(编程接口)。createDataFrame的方法创建
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, SparkSession}
object TestSparkSql {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkSql").setMaster("local[*]")
val sc: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
// 将本地的数据读入 RDD
val peopleRdd = sc.sparkContext.textFile("file:\\F:\\Input")
// 将 RDD 数据映射成 Row,需要 import org.apache.spark.sql.Row
import org.apache.spark.sql.Row
val rowRDD: RDD[Row] = peopleRdd.map(line => {
val fields = line.split(",")
Row(fields(0), fields(1).trim.toInt)
})
val structType: StructType = StructType(
//字段名,字段类型,是否可以为空
StructField("name", StringType, true) ::
StructField("age", IntegerType, true) :: Nil
)
//将DataFrames创建成一个临时的视图
val df: DataFrame = sc.createDataFrame(rowRDD,structType)
df.createTempView("people")
sc.sql("select * from people").show() //使用SQL语句进行查询
sc.stop()
}
}
方式三:通过 case class 创建 DataFrames(反射)。通过 case classRDD转化成DataFrame
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
//定义case class,相当于表结构
case class People(var name: String, var age: Int)
object TestSparkSql {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkSql").setMaster("local[*]")
val sc: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
// 将本地的数据读入 RDD, 并将 RDD 与 case class 关联
val peopleRdd = sc.sparkContext.textFile("file:\\F:\\Input\\people.txt")
.map(line => People(line.split(",")(0),line.split(",")(1).trim.toInt))
import sc.implicits._
// 将RDD 转换成 DataFrames
val df: DataFrame = peopleRdd.toDF
//将DataFrames创建成一个临时的视图
df.createOrReplaceTempView("people")
sc.sql("select * from people").show() //使用SQL语句进行查询
sc.stop()
}
}