如何使用配置单元从给定范围生成随机日期
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 中测试。
使用配置单元。我需要生成从“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 中测试。