概述
结构化的数据提供更多关于数据本身的属性和信息,组织、处理数据时更加方便。
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]的别名。
val dataset = Dataset[Person] //type DataFrame = Dataset[Row]// Row 是一个类,类似于数组,可以把DataFrame看成Row数组,Array[Row]//转化为RDD,可以看出DataFrame 和 Dataset 的区别。val dfRdd = df.map(r=>{r.get(0)+"_"+r.get(1)})val dsRdd = ds.map(r =>{r.age+":"+r.name})
基本操作
Spark 2.X,为了更好的支持SQL操作,提供SparkSession作为启动入口。
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("Spark SQL basic example").config("spark.some.config.option", "some-value").getOrCreate()// For implicit conversions like converting RDDs to DataFramesimport spark.implicits._
DataFrame创建与操作
创建主要有两种形式:1、文件中读取,2、Rdd.toDF(),这个比较常用。
// 文件中读取val df = spark.read.json("people.json")// rdd 转 DataFrameval rdd1 = rdd0.map(r=> People(r)) // 元素需要转换成对象。val df = rdd1.toDF()
操作
import spark.implicits._ // 用于支持$ 操作df.select("name").show()df.select($"name",$"age"+1).show()df.filter($"age">21).show()
SQL语句操作
执行SQL语句后,返回的是DataFrame对象。
// 需要创建一个SQL的临时视图df.createOrReplaceTempView("people")val sqlDF = spark.sql("SELECT * FROM people")sqlDF.show()
还有全局视图,可以会话间共享?
