Spark SQL基础

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 按照年龄降序排列文件中的数据。

  1. 进入 Spark Shell 环境
  2. 加载数据为 Dataset
val d1 = spark.read.textFile("hdfs://192.168.121.131:9000/input/person.txt")
d1.show()
  1. 给 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()
  1. 将 Dataset 转为 DataFrame
val pdf = personDataset.toDF()
  1. 执行 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()
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值