历史版本17 :SparkSQL语法概述 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

FineDataLink 版本功能变更
3.6.2
数据转换节点 新增算子「Spark SQL」算子,可实现较灵活的数据转换功能
4.0.17
  • 「Spark SQL」算子支持使用加密相关函数和变

  • 同时支持作为数据源输入参数或常量

1.2 说明

本文介绍常用的 Spark SQL 语法。

其中「编码函数」、「加密函数」、「签名函数」等常用于进行API加密认证取数,文档示例详情参见:API取数-加密身份验证&按页数取数

注:Spark SQL 算子具体用法请参见:Spark SQL算子

2. 常用语法编辑

示例提供一张数据表,后续展示不同的 SparkSQL 语法取数后的效果。

2.1 group by 分组去重

应用示例详情参见:数据去重

注:尽量避免使用 DISTINCT 进行排重,特别是大表操作,用 GROUP BY 代替。 

示例:select id from ab group by id

结果如下图所示:

1648718400171534.png

2.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 

结果如下图所示:

1648780249403502.png

2.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

结果如下图所示:

1648776545114172.png

2.4 max

注:数值类型的数据才能使用 max ,所以本节示例需把 math 列改为 int 类型。

max(col):返回指定列的最大值。 

示例:select max(math)  from ab

1648780475420871.png

2.5 min

注:数值类型的数据才能使用 min ,所以本节示例需把 math 列改为 int 类型。

min(col):返回指定列的最小值。 

示例:select min(math) from ab

结果如下图所示:

1648780554702328.png

2.6 union

注:本节只讲 union 语法的使用,任务完整设计请参见: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

2.6.1 数据准备

本节不用本文第二章的表,所使用的表数据如下所示:

1648781783108724.png

示例表数据下载:a1.xlsa2.xls

2.6.2 操作示例

1)新建任务,将一个数据转换节点拖到设计界面。

拖入两个DB表输入算子,重命名为 a1,a2,使用 SQL 与筛选出表a1,a2的全部数据:select * from a1select * from a2

再拖入Spark SQL 算子,与两个DB表输入算子连线。如下图所示:

2)Spark SQL 算子的 SQL 语句为:SELECT `name`  FROM a1 UNION SELECT `name`  FROM a2 ,效果如下图所示:

注:语句不能直接复制,a1、a2需点击生成。

1648782314749380.png

Spark SQL 算子的 SQL 语句为:SELECT `name`  FROM a1 UNION ALL SELECT `name`  FROM a2,效果如下图所示:

1648782427121910.png

2.7 新增列

推荐您使用「新增列条件赋值

2.8 行转列

推荐您直接使用「行转列」算子。

2.9 base64编码和解码函数

1)base64(expr):转换 expr 为 base 64 字符串。

1686041391114946.png

2)unbase64(expr):以二进制形式返回已解码的 base64 字符串。

1686041360262403.png

3. 环境变量编辑

注1:相关函数默认大写。

注2:如需要引入字符串,字符串不区分单双引号:。

名称FDL的SparkSQL算子内用法SparkSQL是否有内置函数SparkSQL的内置函数用法示例
随机字符串

UUID()

示例:SELECT UUID()

SELECT uuid()

注:不支持改变长度

时间戳(Timestamp)

UNIX_TIMESTAMP()

示例:SELECT UNIX_TIMESTAMP()

SELECT unix_timestamp()

示例:

例如,用户需要使用「沃丰接口」取数,接口鉴权方式需要使用 unix time,nonce 为请求的唯一标识,值是由调用者提供的任意字符串,15分钟内此字符串只能被使用一次;在这里我们使用 SQL 的 uuid 函数生成。因此需要使用上述两个环境变量。

直接将 SparkSQL 作为输入源,输入 SQL 语句:

SELECT	UNIX_TIMESTAMP(now()) AS time_str,	
UUID() AS uuid_str;

即可使用环境变量,取出两个指定的值,如下图所示:

4. 编码函数编辑

注1:相关函数默认大写。

注2:如需要引入字符串,字符串不区分单双引号:。

名称FDL的SparkSQL算子内用法
Base16Encode

BASE16(expr)

示例:SELECT BASE16('FineDataLink')

Base64Encode

BASE64(expr)

示例:SELECT BASE64('FineDataLink')

URLEncode

URLENCODE(expr)

示例:SELECT URLENCODE('FineDataLink')

5. 加密函数编辑

注1:相关函数默认大写。

注2:如需要引入字符串,字符串不区分单双引号:。

名称FDL的SparkSQL算子内用法
MD5

MD5(expr)

示例:SELECT MD5('FineDataLink')

SHA

SHA(expr)

示例:SELECT SHA('FineDataLink')

SHA1

SHA1(expr)

示例:SELECT SHA1('FineDataLink')

SHA2

SHA2(expr, bitLength)

注:bitLength为SHA2的位数,支持SHA-224、SHA-256、SHA-384和 SHA-512,默认为SHA256。

示例:SELECT SHA2('FineDataLink',256)

RSA

RSA(expr,secretKey,keyFormat)

注:secretKey为输入的密钥、格式为base64编码,keyFormat为密钥格式、值为'PKCS1'和'PKCS8'(不区分格式的大小写),本函数返回值格式也为base64编码

示例:SELECT RSA( 'FineDataLink' , 'MIIBCgKCAQEAnLdoA3ba57YHBAenYbLGTcdC48VVvVVDXV6N/W+1FztBRjvNPV1D
MOcIJBrveTlgKug2PCVynaIttaNql6p/+Bm4G41kyZYy7RSaUCaJ3ryjcXsKfClt
nG9vCwbIN+bVchxRzj739zIA1tBHn9v22PhFcEfsSAy2G2EwM4bQ38n2UrMse9wb
LUGT0kzyquwPQs7vriU+1XBkrdssoAqbwgW5yUqxDosYB5h7D1YTW0qKkJ6PPNnL
XbMv2Meyjxq1sbWoF/m8uboaKklqal1ep5UqTp9OFNOaTrVyXY4Gkt7wq3OoNvk9
2cJ1fHz9wnriGo+oNut9gQr1WVjOzRkAwwIDAQAB' , 'PKCS1')

示例:

本文第三节中获取了timestamp、nonce 两个值,签名 sign 为 email 、open_api_token、timestamp、nonce、sign_version 共同组合生成 sign=SHA256(email&open_api_token&timestamp&nonce&sign_version),使用了加密函数。

紧接着本文第三节的算子,新增 SparkSQL 并输入

SELECT SHA2(CONCAT("email&open_api_token",time_str,"&",uuid_str,"&v2") ,256) as sign_str,
time_str,
uuid_str 
from SparkSQL

6. 签名函数编辑

注1:相关函数默认大写。

注2:如需要引入字符串,字符串不区分单双引号:。

名称FDL的SparkSQL算子内用法
HMAC-MD5

HMACMD5(expr,secretKey,format)

其中,secretKey为输入的秘钥,format格式值可选为'HEX'或'BASE64'(不区分格式的大小写)

示例:SELECT HMACMD5( 'FineDataLink' , 'Im a secret key' , 'HEX')


HMAC-SHA1

HMACSHA1(expr,secretKey,format)

其中,secretKey为输入的秘钥,format格式值可选为'HEX'或'BASE64'(不区分格式的大小写)

示例:SELECT HMACSHA1( 'FineDataLink' , 'Im a secret key' , 'HEX')


HMAC-SHA256

HMACSHA256(expr,secretKey,format)

其中,secretKey为输入的秘钥,format格式值可选为'HEX'或'BASE64'(不区分格式的大小写)

示例:SELECT HMACSHA256( 'FineDataLink' , 'Im a secret key' , 'HEX')

7. 字符串处理函数编辑

注1:相关函数默认大写。

注2:如需要引入字符串,字符串不区分单双引号:。

名称FDL的SparkSQL算子内用法
小写转大写

UPPER(expr)

示例:SELECT UPPER('FineDataLink')

大写转小写

LOWER(expr)

示例:SELECT LOWER('FineDataLink')

字符串拼接

CONCAT(expr1expr2, ..., exprN)

示例:SELECT CONCAT('Fine','Data','Link')

左截断

LEFT(expr, len)

示例:SELECT LEFT('FineDataLink',4)

右截断

RIGHT(expr, len)

示例:SELECT RIGHT('FineDataLink',8)

字符串截取

SUBSTR(expr, pos, len)

示例:SELECT SUBSTR('FineDataLink',5,4)