Catalog Catalog是一个抽象类,我们一般用它来对Spark里面的元数据进行操作的,其实现类是CatalogImpl这个类型 我们一般使用catalog是在sparkSession的实例对象里调用的,将返回一个Catalog对象,使用这个对象就可以直接查看元数据了。 val spark = SparkSession.builder().master("local[2]").appName("catalogApp").getOrCreate() spark.catalog.listTables("doudou_test") 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") 1 在这个过程当中,我们有可能把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) 字段名都被代码化了,你要是写错了连编译都不通过 SQL DataFrame Dataset Syntax error runtime compile compile analysis error runtime runtime compile