Rdd,DataFrame和DataSet的区别

这三个都是分布式数据集。但有一点不同,Rdd可以存放用户自定义的数据对象,DataFrame只能存放Row类型的数据和一些Schema信息,而DataSet既可以存放用户自定义的数据类型,又可以存放一些该数据类型的Schema信息。可以说,DataSet结合了Rdd和DataFrame的优点。

Rdd提供了强大的算子操作,但是对于一些结构化数据类型的信息查询并不方便, 比如,假设我们有两个RDD集合,一个存放学生的具体信息,一个存放考试课程的具体信息,现在要求出所有学生的考试分数,就必须使用大量的算子进行操作,然后额外维护一个保存学号的集合,来遍历这个集合输出学号相符的考试情况,假如我们在加入一个Rdd,要求输出3个Rdd中存放的对象的某个字段相等的所有信息,那就更加麻烦,时间复杂度也会指数上升。而且Rdd是不支持更改的,当要对Rdd中的数据进行操作时,它更倾向于创建一个新的Rdd,如果要大量的这样更改Rdd数据的算子操作,会造成频繁的java对象的生成和销毁,gc比较繁琐。

DataFrame由于保持了结构化信息(Schema),如name,age,height等字段的具体信息。它内部存放的是一行一行的数据,可以用spark内嵌的类Row来描述,而且也支持sql操作,非常便于对数据进行操作。实际上,从这张表中,我们也可以看出,DataFrame更像一张分布式的表结构。但它也有一些缺点,比如不能存放用户自定义的对象数据。因此DataSet作为它的替代接口,已经越来越流行。官网上对DataFrame的描述:DataFrame is simply a type alias of Dataset[Row].也就是说DataFrame可以看作是DataSet中存放的是Row类型数据的一个特例。

       DataSet是在spark1.6后加入的。官网上对它的描述为:A Dataset is a distributed collection of data. Dataset is a new interface added in Spark 1.6 that provides the benefits of RDDs (strong typing, ability to use powerful lambda functions) with the benefits of Spark SQL’s optimized execution engine.也就是说DataSet结合了Rdd的优点,并且内部有sql的优化机制。下面我们来看看具体的DataSet创建过程:

SparkConf conf = new SparkConf().setMaster("local");
		SparkSession spark = SparkSession
				  .builder()
				  .appName("dataSet&dataFrame")
				  .config(conf)
				  .getOrCreate();
		
		Person person = new Person("wsh","man");
		Person person2 = new Person("sm","femal");
		Person person3 = new Person("lx","man");
		Encoder<Person> bean = Encoders.bean(Person.class);
		
		Dataset<Person> persons = spark.createDataset(Arrays.asList(person,person2,person3), bean);
		persons.show();
其中Encoder的具体作用是将一个java对象转化为spark的sql的内部表示,也就是通过反射得到其中的字段信息。

而且DataSet是可以offHeap的,也就是说它可以在堆外内存存放,因此可以有效的减少gc频率。正是由于这些优点,DataSet是Spark大力推荐使用的。





扫描二维码关注公众号,回复: 190067 查看本文章




猜你喜欢

转载自blog.csdn.net/summermangozz/article/details/72353463