从给定的输入生成最高数字并使用配置单元将 0 替换为 9

generate Highest Number from the given Input and replacing 0 by 9 using hive

有人可以 Help/suggest 我应该如何处理蜂巢中的以下情况。

我有一列包含一些值,其中一些数字后有 0(6 位数字后)我需要将所有这些 0 替换为 9。如果我在 5 位数字后有 0,那么我需要包括 0在开始然后再次需要替换 6 digits.PFB 之后的 0 一些示例记录和预期输出。

       Input                    output
    1234560000000             1234569999999
     123450000000             0123459999999
      12340000000             0012349999999
       1230000000             0001239999999

所以这里基本上我需要检查从右到 left.ie。 1234560000000 在这里,我将从右侧 (0) 开始检查,一旦找到任何数字,我会将所有 0 替换为 9,如果 0 以外的数字计数小于 6,则将在开头添加 0。

好心推荐

我从未使用过配置单元,但它看起来具有我会在其他一些数据库中使用的所有功能

我们如何 replace 所有 0 到空格,rtrim 右边的空格和 rpad 与 '9' 到原始长度,然后 lpad 最多 13 个带有 '0' 然后 replace 任何空格(在中间,例如,如果我们将 101010000 转换为 000101019999)回到 '0'

replace(
  lpad(
    rpad(
      rtrim(
        replace(num, '0', ' ')
      ),
      length(num),
      '9'
    ),
    13,
    '0'
  ),
  ' ',
  '0'
)

如前所述,从未使用过配置单元,因此这里可能需要解决一些小的语法问题 - 例如,如果配置单元无法通过自动将数字转换为字符串来为您提供数字的长度,您将需要坚持一些东西来进行显式转换。您也可以对数字进行 log10。

我不知道有任何 fiddle 网站提供 hive 作为测试器..

将字符串分成两部分:末尾的数字和其他所有内容,用 9 替换零,连接。

演示:

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*?)(0+)$','|'),'\|') splitted
  from mytable
)s

结果

"1234569999999"
"0123459999999"
"0012349999999"
"0001239999999"