06 Spark SQL 及其DataFrame的基本操作
1.Spark SQL出现的 原因是什么?
Shark是Spaek SQL的前身,Shark提供了类似于Hive的功能,与Hive不同的是,Shark把SQL语句转换成Spark作业,而不是MapReduce作业,Shark的设计导致了两个问题:(1)执行计划优化完全依赖于Hive,不便于添加新的优化策略;(2)Shark是线程级并行,而MapReduce是进程级并行,因此Spark在兼容Hive的实现上存在线程安全问题,导致Shark不得不使用另外一套独立维护的、打了补丁的Hive源码分支。因为上述缺点,在2014年,Shark项目终止,并转向Spark SQL的开发。Spark SQL在Shark原有的基础上重写了逻辑执行计划的优化部分,解决了Shark存在的问题,此外。Spark SQL增加了DataFrame,使用户可以在Spark SQL中执行SQL语句,数据既可以来自RDD,也可以来自Hive、HDFS、Cassandra等外部数据源,还可以是JSON格式的数据。
2.用spark.read 创建DataFrame
使用spark.read操作可以实现从不同类型的文件中加载数据创建DataFrame,如:读取文本文件并创建DataFrame:saprk.read.text("文件名.txt")或spark.read.format.("text").load("文件名.txt"),读取JSON文件并创建DataFrame:saprk.read.json("文件名.json")或spark.read.format.("json").load("文件名.json"),读取Parquet文件并创建DataFrame:saprk.read.parquet("文件名.parquet")或spark.read.format.("parquet").load("文件名.parquet")。
3.观察从不同类型文件创建DataFrame有什么异同?
4.观察Spark的DataFrame与Python pandas的DataFrame有什么异同?
Python pandas的DataFrame 是一种表格型数据结构,按照列结构存储,它含有一组有序的列,每列可以是不同的值,但每一列只能有一种数据类型。DataFrame 既有行索引,也有列索引,它可以看作是由 Series 组成的字典,不过这些 Series 公用一个索引。依赖 Python 这一简洁明了的语言,DataFrame 操作比较简洁,此外 DataFrame 还拥有比较丰富的操作 api 接口,能比较容易实现中小型数据集的操作。此外,Pandas中DataFrame是可以修改的,列操作直接可以进行替换。可以使用df.ix[index]或者df.ix[index_name]或者df[index_name]来处理。
在 Spark 中, DataFrame 是基于 RDD 实现的,一个以命名列方式组织的分布式数据集。实际存储与 RDD 一致,基于行存储,但是 Spark 框架本身不了解 RDD 数据的内部结构,而 DataFrame 却提供了详细的结构信息,Spark DataFrame 将数据以单独表结构,分散在分布式集群的各台机器上,所以 spark dataframe 是天然的分布式表结构。Spark中DataFrame是不可修改的,可以使用df.withColumn()。必须新建一列保存结果,再去删除原来列。
Spark SQL DataFrame的基本操作
创建:
spark.read.text()
spark.read.json()
打印数据
df.show()默认打印前20条数据,df.show(n)
打印概要
df.printSchema()
查询总行数
df.count()
df.head(3) #list类型,list中每个元素是Row类
输出全部行
df.collect() #list类型,list中每个元素是Row类
查询概况
df.describe().show()
取列
df[‘name’]
df.name
df.select()
df.filter()
df.groupBy()
df.sort()