Spark_Sql
原创
©著作权归作者所有:来自51CTO博客作者959_1x的原创作品,请联系作者获取转载授权,否则将追究法律责任
Spark SQL简介
Spark为结构化数据处理引入了一个称为Spark SQL的编程模块。它提供了一个称为DataFrame的编程抽象,并且可以充当分布式SQL查询引擎。
Spark SQL的特性
集成
无缝地将SQL查询与Spark程序混合。 Spark SQL允许您将结构化数据作为Spark中的分布式数据集(RDD)进行查询,在Python,Scala和Java中集成了API。这种紧密的集成使得可以轻松地运行SQL查询以及复杂的分析算法。
统一数据访问
加载和查询来自各种来源的数据。 Schema-RDDs提供了一个有效处理结构化数据的单一接口,包括Apache Hive表,镶木地板文件和JSON文件。
Hive兼容性
在现有仓库上运行未修改的Hive查询。 Spark SQL重用了Hive前端和MetaStore,为您提供与现有Hive数据,查询和UDF的完全兼容性。只需将其与Hive一起安装即可。
标准连接
通过JDBC或ODBC连接。 Spark SQL包括具有行业标准JDBC和ODBC连接的服务器模式。
可扩展性
对于交互式查询和长查询使用相同的引擎。 Spark SQL利用RDD模型来支持中查询容错,使其能够扩展到大型作业。不要担心为历史数据使用不同的引擎。
Spark SQL架构


DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象
DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序.
三者之间的转换
org.apache.spark
spark-sql_2.12
3.0.0
object Spark_Sql03 {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Sql")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
// RDD <=> DF : toDF, .rdd
val rdd = spark.sparkContext.makeRDD(List((1, "1"), (2, "2")))
// rdd -> df
val df = rdd.toDF("id", "name")
df.show()
// df -> rdd
val rowRDD = df.rdd
// df <=> ds
// df -> ds
val ds: Dataset[User] = df.as[User]
// ds -> df
val df1 = ds.toDF()
//rdd <=> ds
// rdd -> ds
val ds1 = rdd.map {
case (id, name) => {
User(id, name)
}
}.toDS()
// ds -> rdd
val rdd1 = ds1.rdd
spark.close()
}
case class User(id:Int, name: String)
}

UDF
用户自定义函数
下面的实例通过自定义一个prefixName函数然后在SparkSQL中运用
object Spark_Sql04 {
def main(args: Array[String]): Unit = {
//UDF 用户自定义函数
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Sql")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
val df:DataFrame = spark.read.json("data/user.json")
// df.show()
//SQL
df.createOrReplaceTempView("user")
spark.udf.register("prefixName", (name: String) => {
"Name" + name
})
// 聚合功能:把每条数据存进缓冲区中完成聚合
spark.sql("select age, prefixName(username) from user").show
spark.close()
}
}