Spark中的RDD(二):进化到DataFrame与Dataset
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
对执行计划的细节,参考另一篇文章.