赞
踩
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条自增数据)
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
- ;

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。