如果表格存储中的数据具有特殊结构(例如需要解析特定的JSON字符串),可以使用用户自定义函数(UDF,User Defined Function)对每一行数据执行自定义处理逻辑。
工作原理
UDF 运行在MaxCompute侧,而非表格存储侧。MaxCompute 从表格存储读取行数据,将数据传入 UDF,并将处理结果返回给 SQL 查询。开发流程为:用 Java 编写 UDF 逻辑,打包为 JAR 文件,注册到 MaxCompute,然后在 SQL 语句中调用。
前提条件
已创建表格存储实例和数据表
已创建MaxCompute项目,且项目具有访问该数据表的权限
本机已安装 IntelliJ IDEA
操作步骤
在 IntelliJ 中安装 MaxCompute-Java/MaxCompute-Studio 插件。具体操作,请参见安装MaxCompute Studio。
插件安装完成后,即可开始开发 UDF。
以下为一个简单的 UDF 定义示例,功能为串接两个字符串。MaxCompute 支持更复杂的 UDF,包括自定义窗口执行逻辑等。更多信息,请参见开发UDF。
public class ExtractBusID extends UDF { // TODO define parameters and return type, e.g: p public String evaluate(String a, String b) { StringBuilder sb = new StringBuilder(); sb.append(a); sb.append(":"); sb.append(b); return sb.toString(); } }打包并将 JAR 文件上传至 MaxCompute。具体操作,请参见打包、上传及注册。
运行 bin/odpscmd.bat,在 SQL 查询中调用 UDF。
以下示例从
test_table中取出 1 行数据,将name列两次传入 UDF,并将串接结果以udf_test返回。将cloud_metric_extract_md5替换为实际注册的函数名:-- 选出 1 行数据,将 name/name 传入 UDF,返回两个字符串的串接结果。 select cloud_metric_extract_md5(name, name) as udf_test from test_table limit 1;返回结果如下:
odps@ table_store_sql_engine_dev>select cloud_metric_extract_md5(c,c) as udf_test from cloud_metric_stable limit 1; ID = 20170302055324953gq1tsau1 Log view: http://logview.odps.aliyun-inc.com:8080/logview/?h=http://service-corp.odps.aliyun-inc.com/api&p=table_store_sql_eng 055324953gq1tsau1&token=d2l4cGJkSk9VRW1GQkNmNXZCV0JOZWQ4T21zPSxPRFBTX09CTzoxNDE0MDcwMjYwNjg3NzQ1LDE0OTkwMDkwMDAwMDAsODkwMDAwMDUseyJ FjdGlvbiI6WyJvZHBzOlJlYWQiXSwiUmVzb3VyY2UiOlsiYWNzOm9kcHM6KjpwcmplY3RzL3RhYmxlX3N0b3JlX3NxbF9lbmdpbmVfZGV2Il19 c3RhbmNlcy8yMDE3MDMwMjA1NTMyNDk1M2dxMXRzYXUxIl0sIkVmZmVjdCI6IkFsbG93In0= FjdGlvbiI6WyJvZHBzOlJlYWQiXSwiUmVzb3VyY2UiOlsiYWNzOm9kcHM6KjpwcmplY3RzL3RhYmxlX3N0b3JlX3NxbF9lbmdpbmVfZGV2Il19 c3RhbmNlcy8yMDE3MDMwMjA1NTMyNDk1M2dxMXRzYXUxIl0sIkVmZmVjdCI6IkFsbG93In0= c3RhbmNlcy8yMDE3MDMwMjA1NTMyNDk1M2dxMXRzYXUxIl0sIkVmZmVjdCI6IkFsbG93In0= c3RhbmNlcy8yMDE3MDMwMjA1NTMyNDk1M2dxMXRzYXUxIl0sIkVmZmVjdCI6IkFsbG93In0= Job Queueing... QuotaCPUUsage: 99.99% QuotaMemUsage: 79.36% STAGES STATUS TOTAL COMPLETED RUNNING PENDING BACKUP M1_job_0 ................ TERMINATED 1 1 0 0 0 R2_1_job_0 .............. TERMINATED 1 1 0 0 0 STAGES: 02/02 [============================>>] 100% ELAPSED TIME: 350.08 s Summary: +----------+ | udf_test | +----------+ | code4xx1,0.00,netflow,2512570.00,qps,2989.00,p99RT,95607.60,code5xx,0.00,MaxRT,432553.00,MinRT,0.00,AvgRT,9940.51... | +----------+
该文章对您有帮助吗?