如何使用配置单元从给定范围生成随机日期

How to generate a random date from a given range with hive

使用配置单元。我需要生成从“2019-01-01”和“2019-10-31”之间的给定日期范围内选择的随机日期。 任何人都可以指导我的查询吗?

使用floor(rand*100)%N+1你可以生成1..N范围内的随机自然数。如果随机数是个位数,使用lpad添加前导0得到两个gigits字符串,如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') returns 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 中测试。