赞
踩
Spark SQL是Apache Spark的一个模块,用于处理结构化数据。它提供了用于处理结构化数据的高级API和查询引擎,以及为处理大规模数据提供了优化和高性能的功能。
Spark SQL可以处理多种数据源,包括关系型数据库、Hive、Parquet、Avro、JSON等。它支持基于SQL的查询,并提供了DataFrame和DataSet这两个抽象概念,用于表示结构化数据。DataFrame类似于关系型数据库中的表,可以进行查询、过滤和聚合操作。而DataSet是DataFrame的类型安全版本,可以通过编译时检查来避免常见的错误。
Spark SQL的查询引擎支持常见的SQL操作,包括选择、投影、连接、聚合、排序等。它还提供了丰富的内置函数,用于数据转换、日期处理、字符串操作等。Spark SQL还支持用户自定义函数(UDF)和用户自定义聚合函数(UDAF),以便用户根据自己的需求扩展功能。
Spark SQL还具有优化查询的能力,它使用Catalyst优化器来对查询进行逻辑和物理优化。Catalyst优化器可以根据数据分布、数据类型和查询模式等因素来选择最佳的执行计划。此外,Spark SQL还支持列式存储、压缩和代码生成等技术,以提高查询性能。
总结起来,Spark SQL是Apache Spark中用于处理结构化数据的模块,它提供了高级API和查询引擎,支持多种数据源和常见的SQL操作,同时具有优化查询和高性能的特点。它使得用户可以使用SQL和关系型数据库的思维来处理大规模的结构化数据。
1). 高性能:Spark SQL使用了列式存储和压缩技术,以及查询计划的优化和代码生成等技术,可以在处理大规模数据时提供高性能的查询和分析能力。
2 多数据源支持:Spark SQL可以处理多种数据源,包括关系型数据库、Hive、Parquet、Avro、JSON等。它提供了统一的API和查询语言,使得用户可以以统一的方式处理不同类型的数据。
3). SQL支持:Spark SQL提供了完整的SQL支持,用户可以使用标准的SQL语法进行查询、过滤、聚合等操作。这使得用户可以利用已有的SQL知识和经验来处理数据。
4). DataFrame和DataSet抽象:Spark SQL引入了DataFrame和DataSet这两个抽象概念,用于表示结构化数据。DataFrame类似于关系型数据库中的表,可以进行查询、过滤和聚合操作。而DataSet是DataFrame的类型安全版本,可以通过编译时检查来避免常见的错误。
5). 内置函数和UDF支持:Spark SQL提供了丰富的内置函数,用于数据转换、日期处理、字符串操作等。同时,它还支持用户自定义函数(UDF)和用户自定义聚合函数(UDAF),以便用户根据自己的需求扩展功能。
6). 扩展性:Spark SQL提供了许多可扩展的接口和机制,使得用户可以根据自己的需求来扩展和定制功能。用户可以自定义数据源、自定义优化规则、自定义函数等。
7). 统一的编程模型:Spark SQL与Spark的其他模块(如Spark Streaming和MLlib)紧密集成,使得用户可以使用统一的编程模型来处理不同类型的数据,从而简化开发和维护工作。
总之,Spark SQL具有高性能、多数据源支持、SQL和DataFrame/DataSet抽象、可扩展性和统一的编程模型等特点,使得用户可以以统一的方式处理大规模的结构化数据。
DataFrame是Spark SQL中的一个重要概念,它可以看作是分布式数据集,以表格的形式组织和表示结构化数据。
DataFrame类似于关系型数据库中的表,它具有类似的行和列的结构。每一行代表一条记录,每一列代表一个属性或字段。DataFrame中的数据可以是各种类型,如整数、字符串、日期、数组、结构体等。
与传统的RDD(弹性分布式数据集)相比,DataFrame具有很多优点。首先,DataFrame提供了高性能的查询和处理能力,可以直接使用SQL语句进行查询、过滤、聚合等操作,而无需编写复杂的代码。其次,DataFrame支持列式存储和压缩,可以在处理大规模数据时提供更高的性能和更小的存储空间。此外,DataFrame还提供了丰富的内置函数和UDF(用户自定义函数)支持,可以方便地进行数据转换和计算。
DataFrame可以从多种数据源中创建,如关系型数据库、Hive表、Parquet、Avro、JSON等。Spark SQL提供了统一的API和查询语言,使得用户可以以一致的方式处理不同类型的数据。
在Spark SQL中,DataFrame是一个不可变的分布式数据集,可以进行转换和操作,生成新的DataFrame。由于DataFrame是惰性求值的,所以操作不会立即执行,而是等到需要结果时才进行计算。这使得Spark可以优化执行计划,并将多个操作合并为一个更高效的执行计划。
总之,DataFrame是Spark SQL中的核心数据结构,它提供了高性能的查询和处理能力,以及丰富的数据转换和计算功能,使得用户可以方便地处理结构化数据。
DataSet是Spark SQL中引入的一个高级抽象概念,它在DataFrame的基础上提供了更强大的类型安全性和表达能力。
DataSet可以看作是强类型的分布式数据集,它与RDD和DataFrame类似,但具有更丰富的类型信息。每个DataSet都有一个编码器(Encoder),用于将对象转换为二进制数据来进行序列化和反序列化。这种类型安全性可以在编译时捕获错误,提供更好的错误检查和调试能力。
DataSet既可以通过编程接口创建,也可以通过DataFrame转换得到。与DataFrame类似,DataSet也支持SQL查询和操作。通过使用lambda表达式和函数式编程的方法,可以更容易地进行复杂的数据转换和计算。
与DataFrame相比,DataSet提供更高级的API和更丰富的功能。DataSet具有更丰富的操作符,可以方便地进行复杂的数据操作和转换。此外,DataSet还支持多种类型的连接操作、窗口函数、自定义聚合函数等高级特性。
虽然DataSet提供了更强大的类型安全性和表达能力,但在一些情况下,DataFrame仍然是更常用的选择。如果数据不需要进行复杂的类型处理,或者对性能要求较高,那么使用DataFrame可能更加简单和高效。
总之,DataSet是Spark SQL中的高级抽象概念,它提供了更强大的类型安全性和表达能力,使得用户可以更方便地进行复杂的数据操作和转换。
DataFrame操作:
selectExpr方法本质与select方法中使用expr函数是一样的,都是用来构建复杂的表达式,下面我们可以看几个例子。
df.selectExpr("appid as newappid").show()
上面这行代码,就是选择appid列并将appid重命名为newappid。
df.selectExpr("count(distinct(appid)) as count1", "count(distinct(brand)) as count2").show()
上面这行代码,就是计算appid去重后的数量,还有brand去重后的数量。
filter()方法
DF.col("id")等价于$"id",取列ColumnName
DF.filter("name=''") 过滤name等于空的行
DF.filter($"age" > 21).show() 过滤age大于21的行,必须增加语句:import spark.implicits._,否则$表达式会报错
DF.filter($"age" === 21) 取等于时必须用===,否则报错,对应的不等于是=!=。等价于DF.filter("age=21")
DF.filter("substring(name,0,1) = 'M'").show 显示name以M开头的行,其中substring是functions.scala,functions.scala包含很多函数方法,等价于DF.filter("substr(name,0,1) = 'M'").show
按照”age”分组,查看数据条数
DF.sort(DF.col("id").desc).show 以DF中字段id降序,指定升降序的方法。另外可指定多个字段排序
=DF.sort($"id".desc).show
DF.sort 等价于DF.orderBy
注意:如果需要RDD与DF或者DS之间操作,那么都需要引入 import spark.implicits._ 【spark不是包名,而是sparkSession对象的名称】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。