SparkSQL之Dataframe

https://spark.apache.org/docs/latest/sql-programming-guide.html sqparksql官方文档

https://spark.apache.org/docs/latest/api/python/index.html pyspark官方文档

Spark SQL的API方案有3种:

  • SQL

  • the DataFrames API

  • the Datasets API.

SparkSQL的dataframe有sql语言操作和python操作接口(实际也是操作RDD), 相比单纯使用python编写RDD操作写更少的代码, 效率更高

SparkSQL的DataFrame没有行索引

DataFrame

在Spark语义中,DataFrame是一个分布式的行(Row对象)集合,可以想象为一个关系型数据库的表,或者一个带有列名的Excel表格。它和RDD一样,有这样一些特点:

  • Immuatable:一旦RDD、DataFrame被创建,就不能更改,只能通过transformation生成新的RDD、DataFrame
  • Lazy Evaluations:只有action才会触发Transformation的执行
  • Distributed:DataFrame和RDD一样都是分布式的
  • dataframe和dataset统一,dataframe只是dataset[ROW]的类型别名。由于Python是弱类型语言,只能使用DataFrame

DataFrame vs RDD

  • RDD:分布式的对象的集合,Spark并不知道对象的详细模式信息
  • DataFrame:分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。
  • DataFrame和普通的RDD的逻辑框架区别如下所示:

s13

  • 左侧的RDD Spark框架本身不了解 Person类的内部结构。
  • 右侧的DataFrame提供了详细的结构信息(schema——每列的名称,类型)
  • DataFrame还配套了新的操作数据的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。
  • DataFrame还引入了off-heap,意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。
  • RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。
  • DataFrame的抽象后,我们处理数据更加简单了,甚至可以用SQL来处理数据了
  • 通过DataFrame API或SQL处理数据,会自动经过Spark 优化器(Catalyst)的优化,即使你写的程序或SQL不仅高效,也可以运行的很快。
  • DataFrame相当于是一个带着schema的RDD

Pandas DataFrame vs Spark DataFrame

  • Cluster Parallel:集群并行执行
  • Lazy Evaluations: 只有action才会触发Transformation的执行
  • Immutable:不可更改
  • Pandas rich API:比Spark SQL api丰富

DataFrame操作

1. 编码入口

要先声明构建SQLContext或者SparkSession,这个是SparkSQL的编码入口。在Spark 2.0之后,官方放弃了1.x时候的SQLContext和HiveContext的时候这样的容易让人困惑的两个入口,统一使用SparkSession作为Spark SQL的功能入口,用来创建DataFrame/DataSet

2.创建Dataframe

使用SparkSession,应用程序可以从现有的RDD、Hive表或Spark数据源或json数据集创建DataFrame 。

  • 从现有RDD转化
  • 从Hive表或Spark数据源
  • 从Json到DataFrame Spark SQL能够自动将JSON数据集以结构化的形式加载为一个DataFrame

3.Dataframe操作

与pandas类似,spark sql的Dataframe也能进行去重、缺失值处理、异常值处理、正则化等数据清洗操作。

发表评论

邮箱地址不会被公开。 必填项已用*标注