使用UDF处理数据

更新时间:
复制 MD 格式

如果表格存储中的数据具有特殊结构(例如需要解析特定的JSON字符串),可以使用用户自定义函数(UDF,User Defined Function)对每一行数据执行自定义处理逻辑。

工作原理

UDF 运行在MaxCompute侧,而非表格存储侧。MaxCompute 从表格存储读取行数据,将数据传入 UDF,并将处理结果返回给 SQL 查询。开发流程为:用 Java 编写 UDF 逻辑,打包为 JAR 文件,注册到 MaxCompute,然后在 SQL 语句中调用。

前提条件

  • 已创建表格存储实例和数据表

  • 已创建MaxCompute项目,且项目具有访问该数据表的权限

  • 本机已安装 IntelliJ IDEA

    操作步骤

    1. 在 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();
          }
      }
    2. 打包并将 JAR 文件上传至 MaxCompute。具体操作,请参见打包、上传及注册

    3. 运行 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... |
      +----------+