创建作业
多方安全计算是可信智能计算提供的关系型数据安全共享和分析功能。您可以创建多方安全计算作业,根据合作方已提供的数据,编写相关SQL作业并获取您所需要的分析结果,同时能够在作业运行保护数据使用方的数据查询和搜索条件,避免因查询和搜索请求造成的数据泄露。
约束限制
- SQL语法支持
- 关键词:select 、from 、where 、inner join/join/left outer join/right outer join、group by 、order by、limit、on 、as、union all;
- 逻辑表达式: <、 >、 = 、<= 、>=、 <>、 between and、 in、 like、 exists;
- 运算符:+、-、*、/ 和 case when;
- 数据类型:字符串、 整型、 浮点型、 decimal、日期(date)、 时间(timestamp);
- 聚合函数:max、min、sum、avg、count、median、variance;
- 系统函数:包含时间日期函数、字符串函数、数学函数。使用介绍如表1所示。
- 通配符:%;--与like配合使用;
- 注意事项:
- 不识别的数据类型被认为是字符串类型。
- “隐私保护等级”设置为高级别后,参与多方计算的字段会进行秘密分享加密。
- “隐私保护等级”设置为高级别后,参与2方计算的join字段会使用psi算法输出碰撞的密文数据。
- 由于本地数据集不支持统计信息上报,因此本地数据集不支持差分隐私功能。
创建多方安全计算作业
- 用户登录进入计算节点页面。
- 在左侧导航树上依次选择 ,打开多方安全计算页面。
- 在“创建”。
页面,在页面上方选择作业创建的空间后,单击图1 创建作业
- 在弹出的对话框中,输入作业“名称”和“描述”信息后单击“确定”。
图2 新建作业
- 在作业列表中查找创建的作业,单击“开发”,进入作业开发页面编写SQL语句。
- 在作业开发页面“合作方数据”一栏可查看此空间合作方共享的数据集。数据集第一级是合作方名称,第二级是数据集名称。SQL语句中用“合作方名.数据集名”表示一张表。
- SQL语法支持
- 关键词:select 、from 、where 、inner join/join/left outer join/right outer join、group by 、order by、limit、on 、as、union all;
- 逻辑表达式: <、 >、 = 、<= 、>=、 <>、 between and、 in、 like、 exists;
- 运算符:+、-、*、/ 和 case when;
- 数据类型:字符串、 整型、 浮点型、 decimal、日期(date)、 时间(timestamp);
- 聚合函数:max、min、sum、avg、count、median、variance;
- 系统函数:包含时间日期函数、字符串函数、数学函数。使用介绍如表1所示。
- 通配符:%;--与like配合使用;
- 编写SQL语句时,您可以使用作业变量定义需要在执行中替换的过滤条件值
- 作业变量名仅可使用字母、数字、下划线,否则不会被识别,格式为${变量名},如:${USER_NAME}
- 作业变量值为字符串类型时,需要在定义时左右加单引号,如:'${USER_NAME}'
- 作业变量命名长度限制0-20个字符,可支持40个变量
- 编写SQL语句时,您可以参考编辑器右侧的“系统函数”,在SQL语句中输入并使用系统函数。
表1 系统函数介绍 系统函数类型
函数
命令格式
命令说明
参数说明
返回值说明
数学函数
ABS
abs(number)
计算number的绝对值。
number:必填。参数类型支持INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING。
如果输入为STRING类型,则隐式转换为DECIMAL类型后参与运算。
- 输入为INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING,则返回对应输入参数的数据类型。
- 当输入非INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING六种类型,返回报错。
LN
ln(number)
计算number的自然对数。
number:必填。参数类型支持INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING。
如果输入为STRING类型,则隐式转换为DECIMAL类型后参与运算。
- 当number为INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING类型时返回DOUBLE类型。
- 当number为负数或0时,返回报错。
RAND
rand(seed)
返回随机数,返回值区间是0~1。
seed:选填。参数类型支持INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING。
如果输入为STRING类型,则隐式转换为DECIMAL类型后参与运算。
返回DOUBLE类型。
ROW_NUMBER
row_number()
返回记录行数
long:必填。参数类型为LONG类型。
返回LONG类型。
MEDIAN
median(number)
聚合运算,返回一列数的中位数
number:必填。参数类型支持INT、BIGINT、FLOAT、DOUBLE、DECIMAL。
- 当number为INT、BIGINT类型时返回DOUBLE类型。
- 当number类型为FLOAT、DOUBLE、DECIMAL时返回DECIMAL类型。
VARIANCE
variance(number)
聚合运算,返回一列数的方差
number:必填。参数类型支持INT、BIGINT、FLOAT、DOUBLE、DECIMAL。
- 当number为INT、BIGINT类型时返回DOUBLE类型。
- 当number类型为FLOAT、DOUBLE、DECIMAL时返回DECIMAL类型。
字符串操作函数
CHAR_LENGTH
char_length(string)
计算字符串string的长度。
string:必填。参数类型为STRING类型。
如果输入为非STRING类型,则隐式转换为STRING类型后参与运算。
返回INT类型。
CHARACTER_LENGTH
character_length(string)
计算字符串string的长度。同CHAR_LENGTH。
string:必填。参数类型为STRING类型。
如果输入为非STRING类型,则隐式转换为STRING类型后参与运算。
返回INT类型。
LOWER
lower(string)
将字符串string中的大写字符转换为对应的小写字符。
string:必填。参数类型为STRING类型。
如果输入为非STRING类型,则隐式转换为STRING类型后参与运算。
返回STRING类型。
UPPER
upper(string)
将字符串string中的小写字符转换为对应的大写字符。
string:必填。参数类型为STRING类型。
如果输入为非STRING类型,则隐式转换为STRING类型后参与运算。
返回STRING类型。
SUBSTRING
substring(string from start[ for length])
返回字符串string从start开始,长度为length的子串。
返回STRING类型。
BASE64_ENCODE
BASE64_ENCODE(binary)
将二进制的字节内容用base64编码并输出成utf8编码的字符串。
binary:必填。参数类型为字节数组byte[]类型。
返回utf8格式的STRING字符串。
BASE64_ENCODE
BASE64_ENCODE(string)
将字符串用base64编码并输出成utf8编码的字符串。
string:必填。参数类型为utf8格式的STRING类型。
返回utf8格式的STRING字符串。
BASE64_DECODE
BASE64_DECODE(string)
将base64编码后的字符串解码为明文的字符串。
string:必填。参数类型为base64编码后的STRING类型。
返回utf8格式的STRING字符串。
HEX_ENCODE
HEX_ENCODE(binary)
将二进制的字节内容用hex编码并输出成utf8编码的字符串
binary:必填。参数类型为字节数组byte[]类型。
返回utf8格式的STRING字符串。
HEX_ENCODE
HEX_ENCODE(string)
将字符串用hex编码并输出成utf8编码的字符串。
string:必填。参数类型为utf8格式的STRING类型。
返回utf8格式的STRING字符串。
HEX_DECODE
HEX_DECODE(string)
将hex编码后的字符串解码为明文的字符串。
string:必填。参数类型为hex编码后的STRING类型。
返回解码所得到的STRING字符串的ASCII码值。
STR_UTF8
STR_UTF8(binary)
将二进制的字节内容直接转换为utf8格式的字符串。
binary:必填。参数类型为字节数组byte[]类型。
返回utf8格式的STRING字符串。
AES_DECRYPT
AES_DECRYPT(binary, binary)
将加密的二进制字节内容使用用户上传的密钥和数据的iv字节解密。
用户上传的密钥是指在上传密钥上传的AES密钥。
binary:必填。加密的数据,参数类型为字节数组byte[]类型。
binary:必填。加密时使用的iv信息,参数类型为字节数组byte[]类型。
返回解密后的字节数组。
可以再使用STR_UTF8和BASE64_ENCODE函数将其转为字符串STRING格式。
AES_ENCRYPT
AES_ENCRYPT(binary, binary)
将二进制字节内容使用用户上传的密钥和数据的iv字节加密。
用户上传的密钥是指在上传密钥上传的AES密钥。
binary:必填。需要加密的明文数据,参数类型为字节数组byte[]类型。
binary:必填。加密时使用的iv信息,参数类型为字节数组byte[]类型。
返回加密后的字节数组。
可以再使用STR_UTF8和BASE64_ENCODE函数将其转为字符串STRING格式。
时间日期函数
YEAR
year(date)
返回日期date的年。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
QUARTER
quarter(date)
返回日期date的季度
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
MONTH
month(date)
返回日期date的月。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
WEEK
week(date)
返回日期date位于当年的第几周。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
DAYOFYEAR
dayofyear(date)
返回日期date位于当年的第几天。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
DAYOFMONTH
dayofweek(date)
返回日期date位于当月的第几天。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
DAYOFWEEK
dayofmonth(date)
返回日期date位于当周的第几天。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
HOUR
hour(date)
返回日期date的小时部分的值。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
MINUTE
minute(date)
返回日期date的分钟部分的值。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
SECOND
second(date)
返回日期date的秒数部分的值。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
EXTRACT
extract(unit FROM date )
返回日期date的时间或日期部分。
date:必填。DATE或TIMESTAMP类型,格式为yyyy-mm-dd或yyyy-MM-dd HH:mm:ss。
unit支持参数:YEAR、QUARTER、
MONTH、WEEK、DOY、DAY、DOW、HOUR、MINUTE、SECOND。
返回INT类型。
date为非DATE或TIMESTAMP类型,返回报错。
UNIX_TIMESTAMP
unix_timestamp(timestamp)
将日期转换为时间戳。
long:必填。参数类型为LONG类型。
支持日期格式:yyyy-MM-dd HH:mm:ss。
返回LONG类型。
- SQL语句示例:
column_A--字段名是租户别名.数据集名.字段名
column_B as alias--支持别名
SUM(column_C) AS alias--支持针对列名的聚合函数
column_A + column_B*2 as alias--支持select中加计算式
FROM
partner1.dataset1 table_A---表名是租户别名.数据集名, 后面可以加一个表别名tableA
JOIN--支持的JOIN类型,详见语法支持。
partner2.dataset2 table_B
ON
table_A.ID = table_B.ID
WHERE
table_A.uid = ${uid}
and table_A.name = '${name}'
and table_A.age = 16
GROUP BY
table_A.ID
ORDER BY
table_A.ID
LIMIT
10
SQL语句开发完成, 可单击页面上方“格式化”来对排版进行美化,完成后单击“保存”。图3 编写SQL语句
- 单击编辑器右侧的“作业配置项”,进行作业配置。
重试:开关开启后,执行失败的作业会根据配置定时进行重试,仅对开启后的执行作业生效。开关关闭后,关闭前已触发重试的作业不受影响,仅对关闭后的执行作业生效。
执行参数:用于作业调优。当前可用执行参数介绍如下:
- job.ins.memory.size:本次作业在各执行节点分配的内存大小,默认200MB。如果作业中间结果过大,需要调高该参数。
- max.result.file.size:最大存储文件大小,默认10GB。如果最终结果存储超过这个大小,则会执行失败,需要调大该值。
- tics.task.concurrency:在TICS所属计算节点执行计算时的并行度,默认值为1。当需要提升作业性能时,可以修改该参数,参考配置为CCE集群中规格时建议配置范围为4~8,大规格部署时建议配置范围为8~16,具体根据实际需求和情况调整。
- user.task.concurrency:在用户所属计算节点计算时的并行度,默认值为1。当需要提升作业性能时,可以修改该参数,参考配置为CCE集群中规格时建议配置范围为4~8,大规格部署时建议配置范围为8~16,具体根据实际需求和情况调整。
- complex.sql.push.connector:ORACLE作业在开启差分隐私开关时,为避免rand语法在ORACLE执行报错,可配置该作业参数为“false”。其他场景下无需配置。
- join.runtime.filter:是否启用两表id初筛机制。配置为“true”后,在执行SQL join前会默认通过ID字段前8位明文来初筛过滤数据,提高join效率。对数据安全要求较高的场景下,建议配置为“false”。
- secret.share.decimal.precision.len:开启“隐私保护等级”高级别开关后,敏感数值比大小会采用秘密分享协议,此参数表示比较数值精确到小数点后位数,取值范围为0~10,最高可支持10位小数之间的比较。
- secret.share.bit.precision.len:开启“隐私保护等级”高级别开关后,敏感数值比大小会采用秘密分享协议,此参数表示秘密分享支持的比大小数值范围,取值范围为8~64之间整数,例如取值为60时,表示可以比较-2^59至2^59-1之间的整数;小数比大小场景下,会乘上10^secret.share.decimal.precision.len放大小数,转化为整数进行比较,如果数值超过比较范围会出现异常提示,并且给出推荐参数。
图4 作业配置
- 单击“保存”后,单击“提交审批”按钮,等完成审批再单击“执行”按钮,等待执行完成后在下方“执行结果”页签查看结果。