1.谈谈你对SparkSQL的理解
SparkSQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此SparkSQL应运而生。
SparkSQL在汲取了shark诸多优势如内存列存储、兼容hive等基础上,做了重新的构造,因此也摆脱了对hive的依赖,但同时兼容hive。除了采取内存列存储优化性能,还引入了字节码生成技术、CBO和RBO对查询等进行动态评估获取最优逻辑计划、物理计划执行等。基于这些优化,使得SparkSQL相对于原有的SQLonHadoop技术在性能方面得到有效提升。
同时,SparkSQL支持多种数据源,如JDBC、HDFS、HBase。它的内部组件,如SQL的语法解析器、分析器等支持重定义进行扩展,能更好的满足不同的业务场景。与SparkCore无缝集成,提供了DataSet/DataFrame的可编程抽象数据模型,并且可被视为一个分布式的SQL查询引擎。
2.谈谈你对DataSet/DataFrame的理解
DataSet/DataFrame都是SparkSQL提供的分布式数据集,相对于RDD而言,除了记录数据以外,还记录表的schema信息。
DataSet是自Spark1.6开始提供的一个分布式数据集,具有RDD的特性比如强类型、可以使用强大的lambda表达式,并且使用SparkSQL的优化执行引擎。DataSetAPI支持Scala和Java语言,不支持Python。但是鉴于Python的动态特性,它仍然能够受益于DataSetAPI(如,你可以通过一个列名从Row里获取这个字段row.columnName),类似的还有R语言。
DataFrame是DataSet以命名列方式组织的分布式数据集,类似于RDBMS中的表,或者R和Python中的dataframe。DataFrameAPI支持Scala、Java、Python、R。在ScalaAPI中,DataFrame变成类型为Row的Dataset:typeDataFrame=Dataset[Row]。
DataFrame在编译期不进行数据中字段的类型检查,在运行期进行检查。但DataSet则与之相反,因为它是强类型的。此外,二者都是使用catalyst进行sql的解析和优化。为了方便,以下统一使用DataSet统称。
DataSet创建
DataSet通常通过加载外部数据或通过RDD转化创建。
1.加载外部数据以加载json和mysql为例:
valds=sparkSession.read.json("/路径/people.json")valds=sparkSession.read.format("jdbc").options(Map("url"-"jdbc:mysql://ip:port/db","driver"-"