Spark SQL基础
Spark SQL介绍
Spark SQL 是一个用于结构化数据处理的 Spark 组件,它支持 JSON、Parquet、Avro、CSV 等具有 Schema 信息的数据格式。与基础的 Spark RDD API 相比,Spark SQL 提供了更丰富的查询和计算接口。
主要特点:
- 无缝组合 SQL 查询与 Spark 应用程序:Spark SQL 允许在 Spark 程序中使用 SQL 或熟悉的 API 查询结构化数据。
- 连接多种数据源:支持 Hive、Avro、Parquet、ORC、JSON、JDBC 等多种数据源。
- 在现有数据仓库上运行 SQL 或 HiveQL 查询:支持 HiveQL 语法及 Hive SerDes 和 UDF。
DataFrame 和 DataSet 结构
DataFrame 结构
DataFrame 是 Spark SQL 提供的编程抽象,类似于关系型数据库中的表,具有 Schema 信息。
DataSet 结构
DataSet 是 Spark 1.6 中新增的 API,提供强类型支持,DataFrame 实际上是一种特殊的 DataSet。
Spark SQL 的基本使用
Spark Shell 启动时会创建 SparkContext 和 SparkSession 实例。SparkSession 封装了 SparkContext,并提供了 DataFrame 和 DataSet 相关 API。
基本使用案例
假设在 HDFS 中有一个文件 /input/person.txt
,我们将使用 Spark SQL 按照年龄降序排列文件中的数据。
- 进入 Spark Shell 环境
- 加载数据为 Dataset
val d1 = spark.read.textFile("hdfs://192.168.121.131:9000/input/person.txt")
d1.show()
- 给 Dataset 添加元数据信息
case class Person(id: Int, name: String, age: Int)
val personDataset = d1.map(line => {
val fields = line.split(",")
Person(fields(0).toInt, fields(1), fields(2).toInt)
})
personDataset.show()
- 将 Dataset 转为 DataFrame
val pdf = personDataset.toDF()
- 执行 SQL 查询
pdf.createTempView("v_person")
val result = spark.sql("select * from v_person order by age desc")
result.show()
Spark SQL 函数
内置函数
Spark SQL 内置了大量函数,可以通过编程方式或 SQL 语句使用。
编程方式使用 lower() 函数:
df.select(lower(col("name")).as("greet")).show()
df.select(upper(col("name")).as("greet")).show()
SQL 语句方式使用 lower() 函数:
df.createTempView("temp")
spark.sql("select upper(name) as greet from temp").show()
自定义函数
用户可以根据需求编写自定义函数(UDF),然后在 Spark SQL 中调用。
窗口(开窗)函数
开窗函数允许在聚合前后显示数据,不减少原表的行数。
聚合类型开窗函数语法:
sum()/count()/avg()/max()/min() OVER([PARTITION BY XXX] [ORDER BY XXX [DESC]])
排序类型开窗函数语法:
ROW_NUMBER() OVER([PARTITION BY XXX] [ORDER BY XXX [DESC]])
示例:使用 row_number() 函数
val spark = SparkSession.builder()
.appName("SparkSQLWindowFunctionDemo")
.master("local[]")
.getOrCreate()