排除最少 6 位数字并替换 Hive 中的尾随数字

Exclude Minimum 6 Digits and Replace Trailing digits In Hive

有人可以帮我在配置单元中编写以下逻辑吗? 我在列中有一个值,其中我的数字尾随 0。我需要用 9 替换所有这些 0,同时用 9 替换 0,我还需要考虑在 9 之前应该至少有 6 位数字,否则需要排除一些 0,这样 9 之前至少可以有 6 digits.PFB 一些场景。

  1. 1234506600000000000

在这里我们可以看到尾随 0 之前的位数是 8 (12345066),所以我只需要将 0 减去 9,输出就像这样。 1234506699999999999.

  1. 1234500000000000000

这里我在尾随 0 之前只有 5 位数字,所以我需要考虑第 6 个位置的 0 也是一个数字,并且需要在将 0 替换为 9 时排除它,因此输出将是 1234509999999999999。

  1. 1000000000000000000

这里我在尾随 0 之前只有 1 位数字,所以我需要排除 5 个额外的 0,并且需要用 9 替换剩余的 0,所以最终输出将像 1000009999999999999。

 Input                        Output

1234506600000000000        1234506699999999999
1234500000000000000        1234509999999999999
1000000000000000000        1000009999999999999

如果您想修改 的 leftjoin 技术,我们可以调整正则表达式以匹配至少 6 位数字,包括 0

with mytable as (
select '1234560000000' as input union all
select '123450000000' union all
select '12340000000' union all
select '1230000000'   
)

select lpad(concat(splitted[0], translate(splitted[1],'0','9')),13,0)
from
(
select split(regexp_replace(input,'(\d{6,}?)(0+)$','|'),'\|') splitted
  from mytable
)s

如果你想走我建议的 replace/pad/replace 路线,你会在 rtrim'd 之后检查数字的长度,如果它小于 6,则用零将它补到 6。如果字符串的长度超过 6 个,rpad 的大多数实现会将字符串截断为 6 个字符——如果不这样做,那么在 rtrim 之后调用 rpad 会很好也很简单。如果配置单元的 rpad 执行子字符串 op