spark-SQL的DataFrame和DataSet

本文介绍两种操作Spark SQL中DataFrame的方法:直接使用DataFrame API和通过注册临时表执行SQL语句。文章详细展示了如何读取JSON文件生成DataFrame,并演示了选择、过滤等基本操作。

1、如何对DataFrame中封装的数据进行操作

       方法一: 

                 sqlContext.read()    返回DataFrameReader对象
          sqlContext.read().json("student.json")   读取一个json文件(这个json文件中的内容不能是嵌套的)读进来变成DataFrame,
          df.select("age").show(),如果没有show,这个程序就不会执行,这个show就类似与Spark中Action类型的算子,触发执行
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;

public class TestSparkSQL {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("DataFrameOps").setMaster("local");
        
        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext = new SQLContext(sc);
        
        DataFrame df = sqlContext.read().json("people.json");
        
        
        /*
         * 操作DataFrame的第一种方式
         * */
        //类似 SQL的select from table;
        df.show();
        //desc table
        df.printSchema();
        
        //select age from table;
        df.select("age").show();
        //select name from table;
        df.select("name").show();
        //select name,age+10 from table;
        df.select(df.col("name"),df.col("age").plus(10)).show();
        //select * from table where age > 20
        df.filter(df.col("age").gt(20)).show();
    }
}
通过df.show()   df.printSchema()便可以查看该df中的信息。

方法二:通过注册临时表,传入SQL语句

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;

public class TestSparkSQL {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("DataFrameOps").setMaster("local");
        
        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext = new SQLContext(sc);
        
        DataFrame df = sqlContext.read().json("people.json");
        
        //将DataFrame中封装的数据注册为一张临时表,对临时表进行sql操作
        df.registerTempTable("people");
        DataFrame sql = sqlContext.sql("SELECT * FROM people WHERE age IS NOT NULL");
        sql.show(); 
    }
}




### 回答1: Spark SQL中的DataFrameDataset是两种非常重要的数据结构,它们都是基于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 中,DataFrame DataSet 是两种常用的数据结构,它们提供了很多操作特性,使 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 操作有时会变得比较复杂,并且需要程序员具备额外的类型知识。因此,根据实际需求来选择适当的数据集合是非常重要的。 总的来说,DataFrame DataSet 都是很重要的 Spark SQL 数据结构,在 Spark 编程中都有着不可替代的作用。使用 DataFrame DataSet 可以帮助我们更加快速、方便地处理分布式数据,提高我们的开发效率代码质量。建议根据项目的需要来选择使用哪种数据集合,在具体操作中尽量避免数据类型转换类型匹配错误等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值