前提
在老的版本1.x中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。
SparkSession是Spark最新的2.x SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的
创建dataFrame的几种方式
- 读json 文件:注意不能读取嵌套类型Json文件
val spark = SparkSession.builder().appName("df1").getOrCreate()
val df1: DataFrame = spark.read.json("./json")
//俩种方式读json文件
// val df1: DataFrame = spark.read.format("json").load("./json")
df1.createTempView("t1")
spark.sql("select * from t1 where age >21")
- 读parquet文件:和读json文件类似
val spark = SparkSession.builder().appName("df1").getOrCreate()
val df1: DataFrame = spark.read.parquet("./a")
- 读取mysql文件
//sparkSql入口
val spark = SparkSession.builder().master("local[*]").appName("df2").getOrCreate()
val map = new util.HashMap[String, String]()
//mysql 配饰四要素
map.put("driver", "com.mysql.jdbc.Driver")
map.put("url", "jdbc:mysql://hadoop-101:3306/spark")
map.put("user", "root")
map.put("password", "root")
//指定表名
map.put("dbtable", "person")
//把表生成DataFrame
val df1: DataFrame = spark.read.format("jdbc").options(map).load()
//加载第二章表
map.put("dbtable", "score")
val df3: DataFrame = spark.read.format("jdbc").options(map).load()
- 通过反射方式将普通RDD转换为DataFrame 注意需要导入隐式转换
a.txt内容如下
1,zhangsan,20
2,lisi,21
3,wangwu,33
//构建sparksql 入口
val spark = SparkSession.builder().master("local").appName("RDD2Dataset").getOrCreate()
//由spark创建sparkContext,创建普通Rdd
val stuRDD = spark.sparkContext.textFile("./a.txt")
//普通RDD转换为DataFrame需要隐式转换
import spark.implicits._
val df1: DataFrame = stuRDD.map(_.split(",")).map(parts ⇒ {
val p = Person1(parts(0).trim.toInt, parts(1), parts(2).trim.toInt)
p
}).toDF()
- 通过动态创建schema的方式加载DataFrame
//sparkSql入口spark
val spark = SparkSession.builder().master("local[*]").appName("RDD2Dataset").getOrCreate()
//普通Rdd的创建RDD[String]
private val rdd1: RDD[String] = spark.sparkContext.textFile("./a")
//先构建RDD[Row]
val rowRdd: RDD[Row] = rdd1.map(_.split(",")).map(x => {
RowFactory.create(Row(x(0).toInt, x(1)+"", x(2).toInt))
})
val list: util.List[StructField] = Arrays.asList(
DataTypes.createStructField("id", DataTypes.IntegerType, true),
DataTypes.createStructField("name", DataTypes.StringType, true),
DataTypes.createStructField("age", DataTypes.IntegerType, true)
)
//创建schema
val schema: StructType = DataTypes.createStructType(list)
//由shema 和 rowRdd 创建DataFrame
val df1: DataFrame = spark.createDataFrame(rowRdd,schema)
- 读Hive 中表数据, 前提配置了spark on hive
val spark = SparkSession.builder().appName("RDD2Dataset").getOrCreate()
val hiveContext = new HiveContext(spark.sparkContext)
hiveContext.sql("drop table spark")