Spark_Sql

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架构

Spark_Sql_第1张图片
Spark_Sql_第2张图片
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)

}

Spark_Sql_第3张图片

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()
  }

}

你可能感兴趣的:(Spark,Spark,Spark,sql,RDD,DataFrame,DataSet)