如何用HIVEQL实现电话号码与DDD区号的拆分存储
HiveQL 实现DDD区号与电话号码拆分方案
前置假设
基于你提供的样例数据逻辑,默认符合以下规则:
- 巴西DDD区号固定为2位数字
- 已正确拆分的数据满足:
DDD字段为2位有效数字,Phone字段为不带区号的纯电话号码 - 未正确拆分的数据满足:
DDD字段为空/非2位有效值,Phone字段前2位为DDD区号,后续内容为纯电话号码
核心实现逻辑
- 若DDD字段已为2位有效内容,直接保留原有DDD和Phone的值
- 若DDD字段无效,提取Phone前2位作为新的DDD,Phone保留第3位开始的剩余内容
代码实现
1. 预览验证(先执行查询确认拆分结果符合预期)
SELECT -- 处理后的DDD字段 CASE WHEN length(trim(DDD)) = 2 THEN trim(DDD) ELSE substr(trim(Phone), 1, 2) END AS DDD, -- 处理后的Phone字段 CASE WHEN length(trim(DDD)) = 2 THEN trim(Phone) ELSE substr(trim(Phone), 3) END AS Phone -- 其余需要保留的原始表字段直接追加在此处即可 FROM 你的原始表名称;
2. 写入目标表(验证结果无误后执行)
-- 第一步:创建目标表(已创建可跳过) CREATE TABLE IF NOT EXISTS 你的目标表名称( DDD STRING COMMENT '2位区号', Phone STRING COMMENT '不含区号的电话号码' -- 其余字段和原始表保持一致 ) STORED AS ORC; -- 存储格式可按需调整 -- 第二步:写入处理后的拆分数据 INSERT OVERWRITE TABLE 你的目标表名称 SELECT CASE WHEN length(trim(DDD)) = 2 THEN trim(DDD) ELSE substr(trim(Phone), 1, 2) END AS DDD, CASE WHEN length(trim(DDD)) = 2 THEN trim(Phone) ELSE substr(trim(Phone), 3) END AS Phone -- 其余需要保留的原始表字段直接追加在此处即可 FROM 你的原始表名称;
注意事项
- 若存在特殊非2位长度的DDD区号,调整
length(trim(DDD)) = 2的判断规则即可 - DDD和Phone建议用STRING类型存储,避免数字类型丢失前导0
- 请务必先执行SELECT预览结果,确认拆分逻辑适配你的实际数据后再执行写入操作
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

