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

vsnjm48y  于 2022-11-05  发布在  Hive
关注(0)|答案(2)|浏览(213)

有人可以帮助/建议我如何处理下面的情况在 hive 。
我有一个列,其中包含一些值,其中我有0的一些数字后(6位数后),我需要取代所有这些0的9。如果我有0的5位数后,然后我需要包括0的开始,然后再次需要取代0的6位数后。PFB一些样本记录和预期输出。

Input                    output
    1234560000000             1234569999999
     123450000000             0123459999999
      12340000000             0012349999999
       1230000000             0001239999999

所以这里基本上我需要从右到左检查,即1234560000000这里我将从右(0)开始检查,并且一旦找到任何数字,我将用9替换所有的0,并且如果除0之外的数字计数小于6,则将在开始处添加0。
恳请

nnvyjq4y

nnvyjq4y1#

将字符串拆分为两部分:最后的数字和其他所有数字,用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+)$','$1|$2'),'\\|') splitted
  from mytable
)s

测试结果

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

f87krz0w2#

我从未使用过hive,但它看起来拥有我在其他数据库中会使用的所有函数
我们把所有的0转换成空格,把右边的空格转换成rtrim,把rpad加上“9”转换成原来的长度,然后把lpad一直转换到13加上“0”,然后把replace任何空格(在中间,例如,如果我们把101010000转换成000101019999)转换回“0”,这样怎么样?

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

如前所述,我从来没有使用过hive,所以这里可能有一些小的语法问题需要解决--例如,如果hive没有通过自动将数字转换为字符串来给予你一个数字的长度,你就需要插入一些东西来进行显式转换。你也可以对数字进行log 10转换。
我不知道有任何小提琴网站提供Hive作为测试..

相关问题