ODPS 将列中逗号分隔的数据展示为多行数据

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

原表

err_code desc_cn chans
ST001 签名匹配失败 -1,-2,-3

结果表

err_code desc_cn chan
ST001 签名匹配失败 -1
ST001 签名匹配失败 -2
ST001 签名匹配失败 -3

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

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

1、创建自增表

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

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

ODPS 将列中逗号分隔的数据展示为多行数据_第1张图片

3、SQL计算

INSERT OVERWRITE TABLE dim_yp_sms_error_code_format
SELECT err_code,  MAX(desc_cn) AS desc_cn, chan FROM(
SELECT DISTINCT err_code, desc_cn, chan FROM(
SELECT /* + MAPJOIN(b) */
        a.err_code
        ,a.desc_cn
        ,SUBSTRING_INDEX(SUBSTRING_INDEX(a.chans,',',b.AutoIncreID),',',-1) AS chan
FROM    (
            SELECT  err_code
                    ,desc_cn
                    ,CASE    WHEN chans IS NULL THEN '' 
                             ELSE chans 
                     END AS chans
            FROM    dim_yp_sms_error_code
        ) a
JOIN    incre_table b
ON      b.AutoIncreID <= (LENGTH(a.chans) - LENGTH(REPLACE(a.chans,',','')) + 1)
) t
) t2
GROUP BY err_code, chan
;

你可能感兴趣的:(阿里云,odps,sql,mysql)