目录
摘要:真正理解DataFrame/DataSet sparl sql
摘要:真正理解DataFrame/DataSet sparl sql
一:结构化数据和非结构化数据
结构化数据指的是二维表,意思是这张表有行列,每一行的元素的意义一样,每一列又都有列明,就是我们常见的数据库表。结构化数据分成两部分组成:
1:真实的数据
2:数据的描述信息schema又称元数据信息。
同时满足以上两个条件才可以满足sql查询,否则的话是无法用sql查询数据的,所以说核心思想是schema,只有通过元数据信息才可以获取到数据对应的行列,sql就是这么干的。sql 是structured Query Language 意思是结构化查询语言。
二:DataFrame概念由来
在spark早期版本是没有dataframe的概念的,那个时候所有的数据都是通过RDD进行操作的,而RDD是数据的组合,没有Schema信息,因此也不能用sql查询,所以一切的数据查询写入各种处理操作只能通过RDD算子(https://pg-fly.blog.csdn.net/article/details/109162173)来操作,在有些时候比较复杂。 所以说后来spark增加了对sql的查询操作,让数据处理更加的方便,而这个增加的模块就是DataFrame。
1:DataFrame和RDD类似都是分布式存储的,不可更改的,可以并行处理的数据集合。
2:和RDD不同的是DataFrame增加了schema信息,schema可以描述列明和列数据类型,基于此可以让DtataFrame支持 sql。
3:DataFrame也有和Rdd类似的Transformation操作和Action操作。
4:spark Sql可以将Seq RDD CSV JSON ORC Avro JDBC连接的数据库 以及hive表中的数据用DataFrame操作
5: DataFrame 和RDD可以互相转换
总结:DataFrame增加了spark对二维数据结构的处理,是的spark支持sql查询
三:DataSet的由来
DataFrame 和dataFrame都支持sql操作,因为二者都有schema描述性息,可以通过sql查询指定字段,大体上没有本质的区别。
非说区别的话就是二者内部对数据的封装不一样,DataFrame的每一条数据元素对应一行数据表的数据,而这行数据用Row这么一个类来封装的,row里面就是数据库的每一行数据。但是 不包含类型信息,只有数据。
DataSet 中每一行数据不是Row 而是用户可以自定义,这个自定义用的就是case class(String: name,Int age.....),这样的话,DataSet的每一行数据都是我们自定义的类,而且类型信息都有,不需要强制转换哦。 基于以上有人说DataFrame是特殊的DataSet也没有什么问题,Row是系统给的,case class是自定义的。谈谈RDD、DataFrame、Dataset的区别和各自的优势_weixin_30896511的博客-CSDN博客
四:SparkSession由来
spark2.0版本之前创建RDD用的是SparkContext, 要操作hive表格用的是HiveContext ,要操作spark内置的结构化数据用的是SqlContext,要处理流数据用的是StreamingContext。 这些不同数据源对用不同的操作入口,对编程十分不友好。所以在spark2.0版本之后统一用SparkSeaaoin来处理数据,做到了归一化。
五:Spark Sql简介
1:spark内置模块提供了一个spark-sql的客户端,可以直接在配置了spark运行环境的机器上执行spark-sql,如下我在 windows配置了spark之后,执行cmd spark-sql之后出现下图:
2:spark内置模块spark-shell以可以将结构化数据用sql查询,用法和上图大同小异
3:自己编写spark scala程序的时候涉及到结构化数据DataSet/DataFrame也可以用spark sql操作。
六:Spark Sql可以操作的数据源有哪些
1:来自于hive的数据源,可以直接sal查询hive表,或者转成DataFrame/DataSet
2:spark内置的数据源 指的是spark本身支持数据源,比如Text csv json jdbc等,可以直接用sql,也可以先转成DataFrame/DataSet
3:其他数据源:Seq RDD 内存里的数据,必须自己转成DataFrame/DataSet
注意:不管哪种数据源,一定都是有结构的数据,否则无法用sql插叙。