赞
踩
上节完成的内容如下:
SparkSQL 是 Apache Spark 中用于处理结构化数据的模块。它不仅支持 SQL 查询,还允许你将 SQL 查询与 Spark 的其他强大功能结合使用,如数据流处理和机器学习。SparkSQL 提供了对数据的高度优化的访问方式,可以处理大量的结构化和半结构化数据集。
在Spark 0.x版的时候推出了Shark,Shark与Hive是紧密关联的,Shark底层很多东西还是依赖于Hive,修改了内存管理、物理计划、执行三个模块,底层使用Spark基于内存的计算模型,性能上比Hive提升了很多倍。
Shark更多的是对Hive的改造,替换了Hive的物理执行引擎,提高了执行速度。但Shark继承了大量的Hive代码,因为给优化和维护带来了大量的麻烦。
在Spark1.x版本时Shark被淘汰,在2014年7月1日的SparkSummit上,Databricks宣布终止对于Shark的开发,将重点放到了 SparkSQL 上。
Shark终止后,产生了两个分支:
Spark3.0 超过3400个Jira问题被解决,下面是各个核心组件中分布情况:
Spark SQL 从面世以来不仅结果了 Shark 的接力棒,为Spark用户提高高性能的 SQL On Hadoop 的解决方案,换为Spark带来了通用的、高效的、多元一体的结构化的数据处理能力。
Spark SQL 的优势:
Spark SQL 提供了两个新的抽象,分别是:
DataFrame 的前身是SchemaRDD,Spark 1.3更名为 DataFrame,不继承RDD,自己实现了RDD的大部分功能。
与RDD类似,DataFrame也是一个分布式的数据集:
下图是RDD存储和DataFrame存储的对比图:
Dataset是在Spark1.6中添加的新的接口
DataFrame = RDD[Row] + Schema。DataFrame的前身是 SchemaRDD
Row是一个泛化、无类型的JVM Object
我们可以启动 spark-shell 进行直观的体验:
spark-shell --master local[*]
尝试运行下面的代码:
import org.apache.spark.sql.Row val row1 = Row(1, "abc", 1.2) row1(0) row1(1) row1(2) row1.getInt(0) row1.getString(1) row1.getDouble(2) row1.getAs[Int](0) row1.getAs[String](1) row1.getAs[Double](2)
运行过程如下所示:
DataFrame(DataFrame = RDD[Row] + Schema)
Dataset(Dataset = RDD[case class].toDS)
SparkSQL 支持多种数据类型,这些数据类型可以表示不同种类的结构化数据。理解这些数据类型有助于你在使用 SparkSQL 进行数据处理时,正确地定义和操作数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。