Spark SQL 及其DataFrame的基本操作
1.Spark SQL出现的 原因是什么?
Shark和sparkSQL 但是,随着Spark的发展,其中sparkSQL作为Spark生态的一员继续发展,而不再受限于hive,只是兼容hive;而hive on spark是一个hive的发展计划,该计划将spark作为hive的底层引擎之一,也就是说,hive将不再受限于一个引擎,可以采用map-reduce、Tez、spark等引擎。
Shark为了实现Hive兼容,在HQL方面重用了Hive中HQL的解析、逻辑执行计划翻译、执行计划优化等逻辑,可以近似认为仅将物理执行计划从MR作业替换成了Spark作业(辅以内存列式存储等各种和Hive关系不大的优化);同时还依赖Hive Metastore和Hive SerDe(用于兼容现有的各种Hive存储格式)。这一策略导致了两个问题,第一是执行计划优化完全依赖于Hive,不方便添加新的优化策略;二是因为MR是进程级并行,写代码的时候不是很注意线程安全问题,导致Shark不得不使用另外一套独立维护的打了补丁的Hive源码分支(至于为何相关修改没有合并到Hive主线,我也不太清楚)。
此外,除了兼容HQL、加速现有Hive数据的查询分析以外,Spark SQL还支持直接对原生RDD对象进行关系查询。同时,除了HQL以外,Spark SQL还内建了一个精简的SQL parser,以及一套Scala DSL。也就是说,如果只是使用Spark SQL内建的SQL方言或Scala DSL对原生RDD对象进行关系查询,用户在开发Spark应用时完全不需要依赖Hive的任何东西。
2.用spark.read 创建DataFrame
有以下这几种通过spark.read 创建DataFrame: spark.read.text('people.txt')、spark.read.json('people.json')、spark.read.parquet('people.parquet')、spark.read.format('text).load('people.txt')、spark.read.format('json).load('people.json')、spark.read.format('parquet).load('people.parquet')
3.观察从不同类型文件创建DataFrame有什么异同?
通过spark.read.text('people.txt')这种方式创建DataFrame是以值的形式存储的,通过spark.read.json('people.json')这种方式创建DataFrame是以键值对的形式存储的,通过spark.read.parquet('people.parquet')这种方式创建DataFrame是以列族的形式存储的。
4.观察Spark的DataFrame与Python pandas的DataFrame有什么异同?
pandas的DataFrame 是一种表格型数据结构,按照列结构存储,它含有一组有序的列,每列可以是不同的值,但每一列只能有一种数据类型。拥有丰富、灵活、操作简单的 api,在数据量不大的情况下有较好的效果。Spark的DataFrame 是基于 RDD 的一种数据类型,具有比 RDD 节省空间和更高运算效率的优点,对于大数据量的运算,分布式计算能突破 pandas 的瓶颈,而 Spark 则是分布式计算的典型代表。
Spark SQL DataFrame的基本操作
创建:
spark.read.text()
file='file:///usr/local/spark/examples/src/main/resources/people.txt'
df=spark.read.text(file)
spark.read.json()
file='file:///usr/local/spark/examples/src/main/resources/people.json'
df1=spark.read.json(file)
打印数据
df.show()默认打印前20条数据,df.show(n)
打印概要
df.printSchema()
df1.printSchema()
查询总行数
df.count()
df1.count()
df.head(3) #list类型,list中每个元素是Row类
df.head(3)
df1.head(3)
输出全部行
df.collect() #list类型,list中每个元素是Row类
df.collect()
df1.collect()
查询概况
df.describe().show()
df1.describe().show()
取列
df[‘name’]
df.name
df.select()
df.filter()
df.groupBy()
df1.groupBy('age').count().show()
df.sort()
df1.sort(df1.age.desc()).show()