SniperJaren

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1.请分析SparkSQL出现的原因,并简述SparkSQL的起源与发展。

随着 Spark 的不断发展, Shark 对 Hive 的重度依赖体现在架构上的瓶颈越来越突出。

一方面, Hive 的语法解析和查询优化等模块本身针对的是 MapReduce ,限制了在 Spark 系统上的深度优化和维护;

另一方面,过度依赖 Hive 制约了 Spark 的“One Stack Rule Them All”既定方针,也制约了技术校中各个组件的灵活集成。

在此背景下, Spark SQL 项目被提出来,由 Michael Armbrust 主导开发。

Spark SQL 抛弃原有 Shark 的架构方式,但汲取了 Shark 的一些优点,如内存列存储( In-Memory Columnar Storage )、 Hive 兼容性等,重新开发了 SQL 各个模块的代码。

由于摆脱了对 Hive 的依赖, SparkSQL 在数据兼容、性能优化、组件扩展方面都得到了极大的提升。

Spark SQL 涌盖了 Shark 的所有特性,用户可以从 Shark 进行无缝升级, Shark 的发展画上了句号。

Spark SQL 开始迎来蓬勃的发展阶段。

如今, Spark SQL 已经成为 Apache Spark 中最为活跃的子项目。

 

2. 简述RDD 和DataFrame的联系与区别?

联系:

都有惰性机制,在进行创建、转换,如map方法时,不会立即执行

有许多共同的函数,如filter,排序等

都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出

都有partition的概念

区别:

DataFrame:DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这使得SparkSQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。

RDD:无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。

3.DataFrame的创建

spark.read.text(url)

 

spark.read.json(url) 注意从不同文件类型生成DataFrame的区别。

 

spark.read.format("text").load("people.txt")

 

 

 

spark.read.format("json").load("people.json")

 

4. PySpark-DataFrame各种常用操作

基于df的操作:

打印数据 df.show()默认打印前20条数据

 

打印概要 df.printSchema()

 

查询总行数 df.count()

 

df.head(3) #list类型,list中每个元素是Row类

 

输出全部行 df.collect() #list类型,list中每个元素是Row类

 

查询概况 df.describe().show()

 

取列 df[‘name’], df.name, df[1]

 

基于spark.sql的操作:

创建临时表虚拟表 df.registerTempTable('people')

 

spark.sql执行SQL语句 spark.sql('select name from people').show()

 

5. Pyspark中DataFrame与pandas中DataFrame

分别从文件创建DataFrame

 

比较两者的异同 

1. 索引不同。pandas中创建出来的DataFrame有index索引,而pyspark中创建出来的DataFrame没有。

2. 行列结构不同。pandas中用的是Pandas.Series,而pyspark中用的是Pyspark.sql.Row和Pyspark.sql.Column。

3. RDD不同。spark中的RDD是不可变的,因此DataFrame也是不可变的。而pandas是可变的。

4. 树结构不同。pandas没有树结构输出,而spark中有。

 

pandas中DataFrame转换为Pyspark中DataFrame

 

Pyspark中DataFrame转换为pandas中DataFrame

 

6.从RDD转换得到DataFrame

6.1 利用反射机制推断RDD模式

创建RDD sc.textFile(url).map(),读文件,分割数据项

每个RDD元素转换成 Row

由Row-RDD转换到DataFrame

 

 

6.2 使用编程方式定义RDD模式

#下面生成“表头” 

#下面生成“表中的记录” 

#下面把“表头”和“表中的记录”拼装在一起

 

 

 

7. DataFrame的保存

df.write.text(dir)

df.write.json(dri)

df.write.format("text").save(dir)

df.write.format("json").save(dir)

 

 

 

posted on 2022-05-10 13:58  SniperJaren  阅读(40)  评论(0)    收藏  举报