Spark SQL中dataFrame、dataSet整理

1.RDD是什么?

RDD:弹性分布式数据集,就是数据的一个不可变的分布式元素集合,在集群中跨节点分布。可以把他的内部元素看成是一个Java对象。

2.DataFrame是什么?

DataFrame:以RDD为基础的分布式数据集,与RDD不同点在于DataFrame中的数据都被组织到有名称的列中,类似于一个表结构。可以把他内部元素看成是一个Row对象。

在一个 SparkSession中,应用程序可以从一个 已经存在的 RDD,从hive表,或者从 Spark数据源中创建一个DataFrames。
在这里插入图片描述

3.创建一个DataFrame

创建Dataframe可以通过三种方式:1、从现有的RDD转换 2、从Hive Table转换 3、从spark支持的DataSource转换

1、从现有RDD使用类的反射机制

// Create an RDD of Person objects from a text file
JavaRDD<Person> peopleRDD = spark.read()
  .textFile("examples/src/main/resources/people.txt")
  .javaRDD()
  .map(line -> {
    String[] parts = line.split(",");
    Person person = new Person();
    person.setName(parts[0]);
    person.setAge(Integer.parseInt(parts[1].trim()));
    return person;
  });

// Apply a schema to an RDD of JavaBeans to get a DataFrame
Dataset<Row> peopleDF = spark.createDataFrame(peopleRDD, Person.class);

2、从现有RDD自定义schema

// Create an RDD
JavaRDD<String> peopleRDD = spark.sparkContext()
  .textFile("examples/src/main/resources/people.txt", 1)
  .toJavaRDD();

// The schema is encoded in a string
String schemaString = "name age";

// Generate the schema based on the string of schema
List<StructField> fields = new ArrayList<>();
for (String fieldName : schemaString.split(" ")) {
  StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
  fields.add(field);
}
StructType schema = DataTypes.createStructType(fields);

// Convert records of the RDD (people) to Rows
JavaRDD<Row> rowRDD = peopleRDD.map((Function<String, Row>) record -> {
  String[] attributes = record.split(",");
  return RowFactory.create(attributes[0], attributes[1].trim());
});

// Apply the schema to the RDD
Dataset<Row> peopleDataFrame = spark.createDataFrame(rowRDD, schema);

3.从spark数据源中获取

Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");

4.DataFrame和RDD的优缺点

1、RDD的优点:

  • 编译时类型安全
  • 具有面向对象的风格

缺点:

  • 构建大量Java对象,占用大量堆内存,导致频繁GC影响效率
  • 序列化反序列化性能开销大

2、DataFrame的优点:

  • 引入了off-heap(堆外),这样在构建对象时就会使用操作系统层面的内存,不会占用堆内存,避免了频繁GC
  • 引入了schema元数据,在大量数据传输时只需要序列化和反序列化数据本身而不需要传输结构信息,减少了性能开销。

缺点:

  • 编译时类型不安全,只有在运行时才能发现错误
  • 不再具有面向对象的编程风格

5.DataSet是什么?

DataSet是分布式的数据集合,Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束。

6.创建一个DataSet

1、使用JavaBean类型创建

Person person = new Person();
person.setName("Andy");
person.setAge(32);

// Encoders are created for Java beans
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> javaBeanDS = spark.createDataset(
  Collections.singletonList(person),
  personEncoder
);

2、使用list创建

// Encoders for most common types are provided in class Encoders
Encoder<Integer> integerEncoder = Encoders.INT();
Dataset<Integer> primitiveDS = spark.createDataset(Arrays.asList(1, 2, 3), integerEncoder);
Dataset<Integer> transformedDS = primitiveDS.map(
    (MapFunction<Integer, Integer>) value -> value + 1,
    integerEncoder);

3、通过读取文件创建DataFrame,再转换为DataSet

// DataFrames can be converted to a Dataset by providing a class. Mapping based on name
String path = "examples/src/main/resources/people.json";
Dataset<Person> peopleDS = spark.read().json(path).as(personEncoder);

7.RDD、DataSet、DataFrame之间的区别

1、RDD与DataFrame之间的区别

  • 提升执行效率:heap-off避免了频繁GC、引入了schema,减少了序列化的性能开销
  • 减少数据读取:dataframe可以通过sql语句筛选掉不想要的行或者列
  • 执行优化:filter下推,先join再filter->先filter再join

2、RDD与DataSet之间的区别

  • DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式被存储,不需要反序列化就可以执行sorting、shuffle等操作。
  • DataSet创立需要一个显式的Encoder,把对象序列化为二进制,可以把对象的scheme映射为Spark SQl类型,然而RDD依赖于运行时反射机制。

3、DataSet和DataFrame之间的区别

  • DataSet可以在编译时检查类型
  • DataSet是面向对象的编程接口
  • DataFrame和DataSet可以相互转化,df.as[ElementType]这样可以把DataFrame转化为DataSet,ds.toDF()这样可以把DataSet转化为DataFrame。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQLDataFrameDataset是两种非常重要的数据结构,它们都是基于RDD的分布式数据集,但是它们提供了更高级别的API,可以更方便地进行数据处理和分析。 DataFrame是一种类似于关系型数据库表的数据结构,它由一组有命名的列组成,每个列都有一个数据类型。DataFrame可以通过SQL语句或者DataFrame API进行查询和操作,支持类似于SQL的聚合、过滤、排序等操作,同时也支持复杂的数据类型和嵌套结构。 DatasetSpark 1.6版本引入的新概念,它是一个类型安全的分布式数据集,可以通过编译时检查来避免类型错误。Dataset可以看作是DataFrame的扩展,它支持更多的操作和更高级别的API,同时也提供了更好的性能和可维护性。 总的来说,DataFrameDataset都是Spark SQL非常重要的数据结构,它们提供了更高级别的API和更好的性能,可以帮助我们更方便地进行数据处理和分析。 ### 回答2: DataFrameDataSetSpark SQL处理数据的两种最常用的API。在这两个API,数据使用的是表格形式,而且API的使用非常类似。然而,在很多情况下,DataFrameDataSet还是有些不同的。 DataFrameSpark SQL的一个关系数据,可以从各种数据源读取数据,例如:结构化数据文件、Hive的表、外部关系数据库的表、Avro文件等等。DataFrame是基于分布式数据集的一组数据结构,每个数据集都分为行和列,并且有一个命名的列。DataFrameSpark SQL作为一种概念,表示分布式的数据集,就像一个表格一样,它具有由向量组成的列,每一列都有一个名称和数据类型。 DataSetSpark 1.6引入并在Spark 2.0得到加强。DataSet是强类型API,它提供了类似于RDD的泛型编程接口,同时也继承了DataFrame的一些理念。与DataFrame不同的是,DataSet具有额外的类型安全和更好的性能。其DataSet是有类型的,也就是说,在DataSet存储的数据必须要指定一个类,使用该类的实例来表示数据。 在使用的过程DataFrameDataSet的区别表现在: 1. 类型:DataFrame是一组分布式数据集合,是无类型的 (untyped),因为它们只是在特定的列名和数据类型上进行了验证。而DataSet是强类型的 (typed),因为DataSet可以在编译时对数据的类型进行验证。 2. 优化:DataFrame提供了基于第一代Tungsten的基于列的计算引擎来优化计算,以支持高性能计算。而DataSet提供了基于第二代Tungsten的代码生成器,产生了比DataFrame更优化的代码。 3. 开发复杂度:代码开发的复杂度上,DataSet需要在类型定义显式声明模式 (schemas),这会增加一些重复的代码,而DataFrame不需要这样做。 在实际使用过程,一般情况下,若处理数据时进行数值处理、聚合操作或者切片取部分数据,可以使用 DataFrame。而当数据需要更多的定制操作、需要常规编程的工作时,就要使用 DataSet。 因此,对于数据的处理操作而言,DataFrameDataSet都是非常重要的API,我们可以根据具体的业务需求来选择使用哪一种API。在使用这两个API时我们要根据自己的需求选择哪一种更适合自己的场景。 ### 回答3: Spark是当前最流行的大数据处理框架之一,它有着强大的处理能力和高效的分布式计算能力。在 Spark DataFrameDataSet 是两种常用的数据结构,它们提供了很多操作特性,使 Spark SQL 变得更加方便、快捷和高效。 DataFrame 是一种有结构的分布式数据集合,它是以列为心的数据结构,具有传统上的行和列的属性。DataFrame 是使用 Spark SQL 系统非常重要的概念,主要用于处理结构化数据。DataFrame 支持多种数据源:csv 文件、JSON、Hive、ORC、Parquet、Apache Hive 和 JDBC 数据库等。另外,DataFrame 比 RDD 操作更加高效,在实现上采用了更高级的方法,例如使用 Catalyst 引擎进行优化和查询计划处理,同时还支持 SQL 操作。 DataSetSpark 2.0 版本新增的数据结构,它是一个类型化的分布式数据集合,与 RDD 不同,它需要在编译期间就确定类型。DataSet 数据集合支持 Scala 和 Java 两种语言,并兼容 Spark 原有的操作特性,例如分布式处理、错误容错、高效计算等操作。DataSet 在类型安全和语言特性的支持上比 DataFrame 更加强大,因此可以避免在运行时出现类型匹配错误的问题。 与 DataFrame 相比,DataSet 具有更强的类型安全性和启发式优化特性,因此在某些情况下会比 DataFrame 更加高效和快速。但是,DataSet 操作有时会变得比较复杂,并且需要程序员具备额外的类型知识。因此,根据实际需求来选择适当的数据集合是非常重要的。 总的来说,DataFrameDataSet 都是很重要的 Spark SQL 数据结构,在 Spark 编程都有着不可替代的作用。使用 DataFrameDataSet 可以帮助我们更加快速、方便地处理分布式数据,提高我们的开发效率和代码质量。建议根据项目的需要来选择使用哪种数据集合,在具体操作尽量避免数据类型转换和类型匹配错误等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值