1. 概述
本文介绍常用的 Spark SQL 语法。
注:Spark SQL 算子具体用法请参见:Spark SQL算子
2. 原始数据表
原始数表如下图所示:
示例表下载:示例.xls
ETL 任务设计界面如下图所示:
DB 表输入算子配置界面:
Spark SQL 算子配置界面:
注:「Spark SQL」算子中,表名为上游节点的名称;本文示例中,在「Spark SQL」中写 SQL 语句时,表名为 ab 。
3. 常用语法
3.1 group by分组
注:尽量避免使用 DISTINCT 进行排重,特别是大表操作,用 GROUP BY 代替。
示例:select id from ab group by id
结果如下图所示:
3.2 sum
sum(col):对指定列求和(包含重复值)。
sum(DISTINCT col):对指定列求和(不包含重复值)。
示例 1:select id,sum(math) from ab group by id
示例 2:select id,sum(distinct math) from ab group by id
结果如下图所示:
3.3 count
个数统计。
count(*):统计检索出的行的个数,包括 NULL 值的行。
count(expr):返回指定字段 expr 的非空值的个数。
count(DISTINCT expr[, expr_.]):返回 expr 是唯一的且非 NULL 的行的数量。
示例 1:select count(*) from ab
示例 2:select count(english) from ab
示例 3:select count(distinct english) from ab
结果如下图所示:
3.4 max
注:数值类型的数据才能使用 max ,所以本节示例需把 math 列改为 int 类型。
max(col):返回指定列的最大值。
示例:select max(math) from ab
3.5 min
注:数值类型的数据才能使用 min ,所以本节示例需把 math 列改为 int 类型。
min(col):返回指定列的最小值。
示例:select min(math) from ab
结果如下图所示:
3.6 union
注:本节只讲 union 语法的使用,ETL 任务完整设计请参见:Spark SQL算子
用于合并两个或多个 SELECT 语句的结果集。
UNION:会去除完全重复的。如果不为了去除重复行,建议使用 UNION ALL,并且效率会更高。
示例: SELECT `name` FROM a1 UNION SELECT `name` FROM a2
UNION ALL :对查询的数据集取并集,不会去除重复行。
示例: SELECT `name` FROM a1 UNION ALL SELECT `name` FROM a2
3.6.1 数据准备
本节不用本文第二章的表,所使用的表数据如下所示:
3.6.2 设计界面
1)新建任务,将一个「数据转换」节点拖到设计界面。
拖入两个DB表输入算子,重命名为 a1,a2,使用 SQL 与筛选出表a1,a2的全部数据:select * from a1、select * from a2。
再拖入Spark SQL 算子,与两个DB表输入算子连线。如下图所示:
2)Spark SQL 算子的 SQL 语句为:SELECT `name` FROM a1 UNION SELECT `name` FROM a2 ,效果如下图所示:
注:语句不能直接复制,a1、a2需点击生成。
Spark SQL 算子的 SQL 语句为:SELECT `name` FROM a1 UNION ALL SELECT `name` FROM a2,效果如下图所示:
3.7 新增列
本节提供两种方案。
1)方案一:将某个固定的常量定义为一个新字段
新增 type 列,值为测试 。SQL 语句为:select `name` ,'测试' AS type from ab
结果如下图所示:
2)方案二:利用已有字段通过数学计算方式增加一个字段
新增 biaoji 列,数学成绩大于 90 标记为 1,否则标记为 0。SQL 语句为:select `math` ,if(`math` >90,1,0) AS biaoji from ab
3.8 行转列
详情请参见:Spark SQL算子