概述

结构化的数据提供更多关于数据本身的属性和信息,组织、处理数据时更加方便。
Spark SQL 是Spark中用于结构化数据处理的模块,与RDD API相比,提供了更多的与数据有关的结构信息、操作信息。基于这些信息,Spark SQL执行额外的优化。

SQL

Spark SQL目的是用来执行SQL语句,也可以从Hive表中读取数据,执行SQL语句的返回结果是Dataset、DataFrame 格式的数据。

Dataset和DataFrame

Dataset:分布式数据集。强数据类型、支持lambda 函数,从Spark1.6版本开始被增加。
DataFrame:被组织成列的Dataset数据集,弱数据类型,等同于Dataset[Row]的别名。

  1. val dataset = Dataset[Person] //
  2. type DataFrame = Dataset[Row]
  3. // Row 是一个类,类似于数组,可以把DataFrame看成Row数组,Array[Row]
  4. //转化为RDD,可以看出DataFrame 和 Dataset 的区别。
  5. val dfRdd = df.map(r=>{r.get(0)+"_"+r.get(1)})
  6. val dsRdd = ds.map(r =>{r.age+":"+r.name})

基本操作

Spark 2.X,为了更好的支持SQL操作,提供SparkSession作为启动入口。

  1. import org.apache.spark.sql.SparkSession
  2. val spark = SparkSession
  3. .builder()
  4. .appName("Spark SQL basic example")
  5. .config("spark.some.config.option", "some-value")
  6. .getOrCreate()
  7. // For implicit conversions like converting RDDs to DataFrames
  8. import spark.implicits._

DataFrame创建与操作

创建主要有两种形式:1、文件中读取,2、Rdd.toDF(),这个比较常用。

  1. // 文件中读取
  2. val df = spark.read.json("people.json")
  3. // rdd 转 DataFrame
  4. val rdd1 = rdd0.map(r=> People(r)) // 元素需要转换成对象。
  5. val df = rdd1.toDF()

操作

  1. import spark.implicits._ // 用于支持$ 操作
  2. df.select("name").show()
  3. df.select($"name",$"age"+1).show()
  4. df.filter($"age">21).show()

SQL语句操作
执行SQL语句后,返回的是DataFrame对象。

  1. // 需要创建一个SQL的临时视图
  2. df.createOrReplaceTempView("people")
  3. val sqlDF = spark.sql("SELECT * FROM people")
  4. sqlDF.show()

还有全局视图,可以会话间共享?