Hive无分隔符连续字符串按固定长度拆分多行多列方案咨询
Hive 拆分无分隔符连续字符的实现方案
核心逻辑:先通过行转列函数生成对应数量的空行,匹配每一行的字符偏移量,再按固定长度截取字段即可。
前置条件
默认你的源表testdb1.example_table仅存1行数据,data字段存储全量连续字符。
适用Hive 2.1及以上版本
Hive 2.1版本新增sequence函数,可直接生成步长为15的偏移序列(每3个字段共占用15个字符):
select substr(data, offset + 1, 5) as first_col, substr(data, offset + 6, 5) as second_col, substr(data, offset + 11, 5) as third_col from testdb1.example_table lateral view posexplode(sequence(0, length(data)-1, 15)) t as pos, offset -- 过滤末尾不足15个字符的无效片段,不需要可删除该行 where offset + 15 <= length(data);
说明:Hive的substr函数从1开始计数,所以偏移量需要加1做适配
适用Hive 2.1以下版本
低版本没有sequence函数,可以通过空字符串拆分生成序列:
select substr(data, pos*15 + 1, 5) as first_col, substr(data, pos*15 + 6, 5) as second_col, substr(data, pos*15 + 11, 5) as third_col from testdb1.example_table lateral view posexplode(split(space(ceil(length(data)/15)-1), '')) t as pos, val -- 过滤末尾不足15个字符的无效片段,不需要可删除该行 where pos*15 + 15 <= length(data);
输出逗号分隔格式
如果需要直接输出和示例一致的逗号拼接字符串,将select部分替换为:
concat_ws(',', substr(data, offset + 1,5), substr(data, offset +6,5), substr(data, offset +11,5)) as line_content
内容的提问来源于stack exchange,提问作者Antriksh
相关产品推荐
相关产品推荐

