作业七:Spark SQL
Spark SQL
1.请分析SparkSQL出现的原因,并简述SparkSQL的起源与发展。

Spark出现:
- 关系数据库已经很流行
- 关系数据库在大数据时代已经不能满足要求
- 首先,用户需要从不同数据源执行各种操作,包括结构化、半结构化和非结构化数据
- 其次,用户需要执行高级分析,比如机器学习和图像处理
- 在实际大数据应用中,经常需要融合关系查询和复杂分析算法(比如机器学习或图像处理),但是,缺少这样的系统
Spark SQL填补了这个鸿沟:
- 首先,可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系型操作
- 其次,可以支持大数据中的大量数据源和数据分析算法Spark SQL可以融合:传统关系数据库的结构化数据管理能力和机器学习算法的数据处理能力
Spark的出现,使得SQL-on-Hadoop的性能比Hive有了10-100倍的提高:
- 使用Hadoop进行迭代计算非常耗资源
- Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据
背景:
2014年6月1日Shark项目和Spark SQL项目的主持人Reynold Xin宣布:停止对Shark的开发,团队将所有资源放在Spark SQL项目上,至此,Shark的发展画上了句号,但也因此发展出两个分支:SparkSQL和Hive on Spark:
- Spark SQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive
- Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,也就是说,Hive将不再受限于一个引擎,可以采用Map-Reduce、Tez、Spark等引擎
2. 简述RDD 和DataFrame的联系与区别?
DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能,Spark能够轻松实现从MySQL到DataFrame的转化,并且支持SQL查询。DataFram能做的事情RDD都能做,RDD能做的事情DataFrame不一定能做。

区别:
- RDD是分布式的Java对象的集合,但是,对象内部结构对于RDD而言却是不可知的
- DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息
3.DataFrame的创建:
spark.read.text(url)


spark.read.json(url)


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

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

描述从不同文件类型生成DataFrame的区别。
用相同的txt或json文件,同时创建RDD,比较RDD与DataFrame的区别。

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]

选择 df.select() 每个人的年龄+1

筛选 df.filter() 20岁以上的人员信息

筛选年龄为空的人员信息

分组df.groupBy() 统计每个年龄的人数

排序df.sortBy() 按年龄进行排序

基于spark.sql的操作:
创建临时表虚拟表 df.registerTempTable('people')

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

5. Pyspark中DataFrame与pandas中DataFrame
分别从文件创建DataFrame


pandas中DataFrame转换为Pyspark中DataFrame



Pyspark中DataFrame转换为pandas中DataFrame

从创建与操作上,比较两者的异同
| Pandas | Pyspark | |
| 创建上 | 从 spark_df 转换:pandas_df = spark_df.toPandas() |
从 pandas_df 转换:spark_df = SQLContext.createDataFrame(pandas_df),另外,createDataFrame 支持从 list 转换 spark_df,其中 list 元素可以为 tuple,dict,rdd |
| list,dict,ndarray 转换 |
已有的 RDDs 转换 |
|
| CSV文件数据集读取 |
结构化数据文件读取 |
|
| HDF5 读取 |
JSON 数据集读取 |
|
| EXCEL 读取 |
Hive 表读取 |
|
|
外部数据库读取 |
||
| 操作上 | Series 结构,属于 Pandas DataFrame 结构 |
Row 结构,属于 Spark DataFrame 结构 |
| Series 结构,属于 Pandas DataFrame 结构 |
Column 结构,属于 Spark DataFrame 结构,如:DataFrame[name: string] |
|
| df 输出具体内容 |
df 不输出具体内容,输出具体内容用 show 方法 |
|
| 没有树结构输出形式 |
以树的形式打印概要:df.printSchema() |
|
| pandas_df = spark_df.toPandas() |
spark_df = sqlContext.createDataFrame(pandas_df) |
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)
df.write.format("json").save(dir)



浙公网安备 33010602011771号