Catalog

Catalog是一个抽象类,我们一般用它来对Spark里面的元数据进行操作的,其实现类是CatalogImpl这个类型
大数据开发之Spark篇---SparkSQL入门(5)-LMLPHP
大数据开发之Spark篇---SparkSQL入门(5)-LMLPHP
我们一般使用catalog是在sparkSession的实例对象里调用的,将返回一个Catalog对象,使用这个对象就可以直接查看元数据了。

val spark = SparkSession.builder().master("local[2]").appName("catalogApp").getOrCreate()
    spark.catalog.listTables("doudou_test")

大数据开发之Spark篇---SparkSQL入门(5)-LMLPHP

Dataset

我们先来说一下Dataset的历史,在Spark1.0版本的时候,SparkSQL出现了,但那个时候没有DataFrame这个名称而是使用SchemaRDD这个名称,直到Spark1.3版本的时候改名叫做DataFrame了,然后到了Spark1.6版本的时候,Dataset出来了。其主要是为了解决compile-time type safety这个问题,就是强行给DataFrame加多一个泛型。
调用df的as方法,后面跟一个泛型定义好一个case class

def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().master("local[2]").appName("catalogApp").getOrCreate()


    import spark.implicits._

    case class Schema1(id:Int,name:String,age:Int)

    val df = spark.read.format("csv").option("header","true").option("inferSchema","true").load("...")
    val ds = df.as[Schema1]

  }

我们再用代码来解释一下为什么要开发出Dataset这个东西出来
如果我们写SQL的话是这么写的:

val df = spark.sql("select id,name,age from userinfo")

在这个过程当中,我们有可能把SQL的语法给写错了,也有可能把字段名称给写错了,那么我们可以使用DataFrameAPI来编写:

val df = spark.table("userinfo")
val df1 = df.select("name","id","age")

在这个过程中,我们将select写成了代码,如果这个时候你将select写错了,那么是编译不过的,我们只能写错字段名称了。
如果我们犯了上面的错,在编译过程系统是没办法检测到的,只能是我们将代码打成了jar包提交上去了且申请到资源开始运行才知道报错了,这样就极大浪费时间和资源了。
如果使用了Dataset的话,代码就可以这样写了:

val spark = SparkSession.builder().master("local[2]").appName("catalogApp").getOrCreate()

    import spark.implicits._

    case class Schema1(id:Int,name:String,age:Int)

    val df = spark.read.format("csv").option("header","true").option("inferSchema","true").load("...")
    val ds = df.as[Schema1]

    val ds1 = ds.map(x => (x.id,x.name,x.age)).show(false)

字段名都被代码化了,你要是写错了连编译都不通过

01-25 17:30