全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
流计算

创建临时表

更新时间:2017-12-29 15:20:00

如果计算的逻辑比较复杂用一个StreamSQL难以描述,阿里云流计算支持通过定义临时表的方式来简化开发的过程。需要明确的是,临时表仅仅用于辅助计算逻辑的描述,不会产生数据的物理存储。因此,临时表并不占用系统空间。

  1. CREATE TMP TABLE table_name
  2. [(col_name data_type, ...[, PRIMARY KEY(col_name, ...)])]
  3. );

示例

案例一

用户定义了一个业务较为复杂的SQL,后续为了可维护性,进行了业务拆解,通过临时表拆分为多段SQL:

  1. SELECT
  2. s_user.id,
  3. s_user.name,
  4. s_user.age,
  5. dim_visit.visit_count
  6. FROM
  7. (
  8. SELECT
  9. id,
  10. name,
  11. age
  12. FROM
  13. s_datahub_left
  14. UNION ALL
  15. SELECT
  16. id,
  17. name,
  18. age
  19. FROM
  20. s_datahub_right
  21. ) s_user
  22. JOIN
  23. dim_visit
  24. ON
  25. s_user.id = dim_visit.id

上述SQL嵌套层次较深,用户觉得不好维护,因此对于进行业务拆解,因此重新编写逻辑:

  1. --声明临时表,用来封装UNION ALL逻辑
  2. CREATE TMP TABLE tmp_user (
  3. id bigint,
  4. name string,
  5. age bigint,
  6. );
  7. --插入临时表
  8. INSERT INTO tmp_user
  9. SELECT
  10. id,
  11. name,
  12. age
  13. FROM
  14. s_datahub_left
  15. UNION ALL
  16. SELECT
  17. id,
  18. name,
  19. age
  20. FROM
  21. s_datahub_right;
  22. --写入RDS
  23. INSERT into rds_result
  24. SELECT
  25. s_user.id,
  26. s_user.name,
  27. s_user.age,
  28. s_visit.visit_count
  29. FROM
  30. tmp_user
  31. JOIN
  32. dim_visit
  33. ON
  34. tmp_user.id = dim_visit.id;

案例二

用户对于一个SQL计算结果需要两路输出,一路写出到DataHub并最终归档到ODPS,另外一路写出到RDS。那么可以通过临时表封装核心代码逻辑,并通过两路INSERT INTO的SQL写出到最终数据存储:

  1. CREATE TMP TABLE user (
  2. id bigint,
  3. name string,
  4. age bigint,
  5. visit_count bigint
  6. );
  7. INSERT into user
  8. select
  9. s_user.id,
  10. s_user.name,
  11. s_user.age,
  12. s_visit.visit_count
  13. from s_user join s_visit
  14. on s_user.id = s_visit.id;
  15. INSERT INTO rds_result
  16. SELECT
  17. id,
  18. name,
  19. age,
  20. visit_count
  21. FROM
  22. user
  23. WHERE
  24. age > 18;
  25. INSERT INTO datahub_result
  26. SELECT
  27. id,
  28. name,
  29. age,
  30. visit_count
  31. FROM
  32. user;

注意,上述对于临时表user作用在于封装了重复逻辑,后续两路输出直接使用user表即可向两边目标表进行输出。

本文导读目录