当前位置:   article > 正文

ODPS 将列中逗号分隔的数据展示为多行数据_odps 把逗号分割的数组字段打散

odps 把逗号分割的数组字段打散

ODPS 中有的列有数据是逗号分隔的数据,需要转化为多行数据,方便与其他表关联查询。效果如下:

原表

err_codedesc_cnchans
ST001签名匹配失败-1,-2,-3

结果表

err_codedesc_cnchan
ST001签名匹配失败-1
ST001签名匹配失败-2
ST001签名匹配失败-3

 可以借助ODPS mapjoin和自增表实现该功能。

实现主要参考mysql的实现方式,MySQL逗号分割字段的行列转换技巧 - 差不多先生的个人空间 - OSCHINA - 中文开源技术交流社区

1、创建自增表

  1. CREATE TABLE IF NOT EXISTS incre_table
  2. (
  3. autoincreid BIGINT
  4. )
  5. COMMENT '自增表,主要用于拆分字段为逗号分隔的列'
  6. LIFECYCLE 36000;

2、自增表插入数据(这里我插入了150条自增数据)

3、SQL计算

  1. INSERT OVERWRITE TABLE dim_yp_sms_error_code_format
  2. SELECT err_code, MAX(desc_cn) AS desc_cn, chan FROM(
  3. SELECT DISTINCT err_code, desc_cn, chan FROM(
  4. SELECT /* + MAPJOIN(b) */
  5. a.err_code
  6. ,a.desc_cn
  7. ,SUBSTRING_INDEX(SUBSTRING_INDEX(a.chans,',',b.AutoIncreID),',',-1) AS chan
  8. FROM (
  9. SELECT err_code
  10. ,desc_cn
  11. ,CASE WHEN chans IS NULL THEN ''
  12. ELSE chans
  13. END AS chans
  14. FROM dim_yp_sms_error_code
  15. ) a
  16. JOIN incre_table b
  17. ON b.AutoIncreID <= (LENGTH(a.chans) - LENGTH(REPLACE(a.chans,',','')) + 1)
  18. ) t
  19. ) t2
  20. GROUP BY err_code, chan
  21. ;

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/725860
推荐阅读
相关标签
  

闽ICP备14008679号