RDD中不包括任何结构信息(Schema),引入了Schema后,成为了DataFrame, DataFrame 每一行如果可当作一个整体--case class(特殊的rowType),就成为了Dataset.

Dataset是更为强大的结构, 可把DataFrame当成一类特殊类型的DataFrame. 因为DataFrame API出现的较早,所以还在一些地方使用,新版本Spark SQL将会渐渐DeprecateDataFrame.

// 示例 RDD转换为DataFrame代码


val rdd = sc.makeRDD(Seq(
    Row(1, 2, "boy")
    , Row(3, 4, "girl")
    , Row(5, 6, "girl")
    , Row(4, 2, "boy")
  ))

  val schema = StructType(Array(
      StructField("id", IntegerType, true),
      StructField("id", IntegerType, true),
      StructField("gender", StringType, true),
  ))
  private val df: DataFrame = spark.createDataFrame(rdd, schema)

  df.show()

Spark SQL

引入了DataFrame(Dataset)后, 就能方便的使用Spark SQL对数据进行查询了.

  val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()

 df.createTempView("user")
  spark.sql("select * from user where gender ='boy'").show()

在Spark2.0 版本以后, 使用SparkSession 替代SparkContext. Spark SQL 是怎么执行的呢?
整体步骤上,也和MySQL对输入query解析,分析,优化,执行有些类似, 更为准确的,可参考下图:

逻辑阶段: Unresolved -> Analyzed -> Optimized
物理阶段: Iterator ->SparkPlan -> Prepared

对执行计划的细节,参考另一篇文章.

数据处理