引言:
给定一个包含用户基本信息(如姓名、年龄等)的数据集,请统计相同姓名的用户的平均年龄?
SparkRDD实现:
val data = sc.textFile("/data/input.txt").split("\t")
data.map(x=>(x(0),(x(1).toInt,1)))
.reduceByKey((a,b)=>a._1+b._1,a._2+b._2)
.map(x._1,x._2._1/x._2._2).collect
SQL实现:
SELECT name,avg(age) FROM people GROUP BY name
Spark SQL:
1.Spark SQL是Spark的重要组成模块,也是目前大数据生产环境中使用最广泛的技术之一,
主要用于结构化数据处理。
SparkSQL提供相应的优化机制,并支持不同语言的开发API:
java、scala、Python,类SQL的方法调用(DSL)
根据Spark官方文档的定义:
Spark SQL是一个用于处理结构化数据的Spark组件--该定义强调的是"结构化数据",而非"SQL"
介绍SparkSQL,不得不提Hive和Shark,Hive是Shark的前身,Shark是SparkSQL的前身.
根据伯克利实验室提供的测试数据,Shark在基于内存计算的性能比Hive高出10位(将近千倍), 即使基于磁盘计算,它的性能也比Hive高出10倍, 而Spark SQL的性能比Shark又有较大的提升.
SparkSQL的API设计简洁高效,可以与Hive表直接进行交互,并且支持JDBC/ODBC连接,
Spark先后引入了DataFrame和DataSet两种数据结构,以便更加高效地处理各种数据
2.RDD与Spark SQL的比较说明:
---使用Spark SQL的优势:
a.面向结构化数据;
b.优化机制;
---RDD缺点:
a.没有优化机制,如对RDD执行Filter操作;
b.RDD类型转换后无法进行模式推断
3.【RDD与DataFrame结构对比】
RDD与DataFrame的区别: RDD[Person]虽然以Person为类型参数,但是Spark框架本身不了解Person类型的内部结构, 而DataFram却提供了详细的结构信息,使得SparkSQL可以清楚地知道该数据集中包含哪些列, 每列的名称和类型分别是什么,这和关系数据库中的物理表类似。
DataFrame/SchemaRDD:
DataFrame是一个分布式的数据集合,该数据集合以命名列的方式进行整合。
Dateframe=RDD(数据集)+Schema(元数据/模型)
SchemaRDD就是DataFrame的前身,在1.3.0版本后。
SchemaRDD还包含记录的结构信息(即数据字段) DataFrame存放的是ROW对象。每个Row 对象代表一行记录。
https://mvnrepository.com
4.创建Spark SQL环境
a.将SparkSQL依赖库添加至pom.xml文件中
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.2</version>
</dependency>
b.SparkSession
Spark2.0引入了SparkSession,用于在Spark SQL开发过程中初始化上下文,为用户提供统一的入口。
用户可以通过SparkSession API直接创建DataFrame和DataSet。Spark2.0之前版本初始化上下文需要
创建SparkContext、SQLContext、HiveContext、SparkConf,从Spark2.0版本开始不再需要之前复杂
的操作,所有运行时参数设置,获取都可以通过conf方法实现.conf方法返回RuntimeConfig对象,
RuntimeConfig对象包含Spark、Hadoop等运行时的配置信息
Spark2.0之前版本SQLContext创建方式如下:
val sparkConf = new SparkConf().setAppName("word cont")
val sc = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sc)
Spark2.0之后:
通过SparkSession.builder()创建构造器;
并调用.appName("sparkSQL").master("local")设置集群模式以及app名称
最后必须调用getOrCreate()方法创建SparkSession对象。
val spark = SparkSession.builder().appName("sparkSQL").master("local").getOrCreate()
DataFrame(DF):在Spark1.3之前版本中,用户使用Spark SQL时需要直接操作RDD API,学习成本相对较高,
代码结构相对复杂,为了提高任务执行性能,用户还需要掌握一些调优手段,Spark从1.3版本引入DataFrame,
DataFrame是一种带有Schema元信息的分布式数据集,类似于传统数据库中的二维表,定义有字段名称和类型,
用户可以像操作数据库表一样使用DataFrame,DataFrame的开发API简洁高效,代码结构清晰,并且Spark针对
DataFrame的操作进行了丰富的优化。DataFrame支持Java、Scala、Pythont等多种开发语言,不论是专业的开发
人员,还是数据分析人员都可以轻松地使用DataFrame处理结构化数据。
DF创建方式 【4种】
users.txt