7.Spark SQL
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 在数据兼容、性能优化、组件扩展方面都得到了极大的提升.在 2014 年 7 月 1 日的 Spark 峰会上, Databricks 公司宣布终止对 Shark 的开发,将后续重点放到 Spark SQL 上。
2. 简述RDD 和DataFrame的联系与区别?
RDD是弹性分布式数据集,数据集的概念比较强一点。容器可以装任意类型的可序列化元素(支持泛型)RDD的缺点是无从知道每个元素的【内部字段】信息。
DataFrame也是弹性分布式数据集,但是本质上是一个分布式数据表,因此称为分布式表更准确。DataFrame每个元素不是泛型对象,而是Row对象。
DataFrame的缺点是Spark SQL DataFrame API 不支持编译时类型安全,因此,如果结构未知,则不能操作数据;同时,一旦将域对象转换为Data frame ,则域对象不能重构。
DataFrame=RDD-【泛型】+schema+方便的SQL操作+【catalyst】优化
3.DataFrame的创建
spark.read.text(url)
spark.read.json(url)
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]
选择 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
从创建与操作上,比较两者的异同