概述:
sparkSQL是spark用来处理结构化数据的一个模块
提供了一个编程的抽象叫DataFrame作为分布式的查询引擎
作用
1)处理结构化数据
2)先将非机构化的数据转换为结构化数据
编程模型
1)sql select * from user;
2)DateFrame (DSL)
HQL:将sql转换为mr任务
SparkSql将sql转换为rdd任务
特点:
容易整合Spark
统一数据的访问方式
标注的数据连接
支持JDBC/ODBC
支持对接BI
兼容hive
代码范例
package demo
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
object sparksqlDemo {
def main(args: Array[String]): Unit = {
//构建sparksession
val sparksession: SparkSession = SparkSession.builder().appName(“sparksqlDemo”)
.master(“local[2]”).getOrCreate()
//创建rdd
val rdd1: RDD[String] = sparksession.sparkContext.textFile("hdfs://192.168.8.128:9000/sparksql.txt")
//split data
val rdd2: RDD[Array[String]] = rdd1.map(_.split("\t"))
//封装数据
val rdd3: RDD[Row] = rdd2.map(x => {
val id: Int = x(0).toInt
val name: String = x(1).toString
val age: Int = x(2).toInt
Row(id, name, age)
})
rdd2
//schema
val structType = StructType(List(
StructField("id", IntegerType, true),
StructField("name", StringType, true),
StructField("age", IntegerType, true)
))
//create dataframe
val frame: DataFrame = sparksession.createDataFrame(rdd3,structType)
//register table
frame.registerTempTable("user_t")
//sql
val usql: DataFrame = sparksession.sql("select * from user_t")
//check result
usql.show()
sparksession.close()
}
}
结果显示:
DataFrame
转换后显示
根据字段查询
条件过滤
排序
SQL格式

DSL风格
将mysq作为数据源
持久化输出格式为json