如何使用hive从给定范围生成随机日期

tp5buhyn  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(1418)

使用Hive。我需要生成从给定日期范围中选择的随机日期,介于“2019-01-01”和“2019-10-31”之间。有人能告诉我我的问题吗?

sqyvllje

sqyvllje1#

使用 floor(rand*100)%N+1 您可以生成范围为1..的随机自然数。。n。如果随机数是一位数,则使用lpad将前导0加上两个gigigits字符串,如01、02。
演示:

select concat('2019','-',lpad(floor(RAND()*100.0)%10+1,2,0),'-',lpad(floor(RAND()*100.0)%31+1,2,0));

结果:

2019-04-31

添加date()函数以解决不同月份中28、30-31天的问题。date()将无效日期转换为最接近的有效日期:例如,date('2019-02-31')返回2019-03-03
总之:

select date(concat('2019','-',lpad(floor(RAND()*100.0)%10+1,2,0),'-',lpad(floor(RAND()*100.0)%31+1,2,0)));

结果:

2019-07-10

另一个选项是用订单号生成所需的日期范围,并用随机数连接:

set hivevar:start_date=2019-01-01; 
set hivevar:end_date=2019-10-31; 

with date_range as 
(--this query generates date range with order number, max i=303 for this range 
select date_add ('${hivevar:start_date}',s.i) as dt, i 
  from ( select posexplode(split(space(datediff('${hivevar:end_date}','${hivevar:start_date}')),' ')) as (i,x) ) s
)

--join range generated with random number 0..303(check max in date_range)
select d.dt from date_range d inner join (select floor(RAND()*100.0)%304 as i) r on d.i=r.i;

结果:

2019-01-12

都是在Hive里测试的。

相关问题