【发布时间】:2019-12-04 02:28:49
【问题描述】:
使用蜂巢。我需要生成从给定日期范围中选择的随机日期,介于“2019-01-01”和“2019-10-31”之间。 谁能指导我的查询?
【问题讨论】:
标签: sql random hive hiveql date-range
使用蜂巢。我需要生成从给定日期范围中选择的随机日期,介于“2019-01-01”和“2019-10-31”之间。 谁能指导我的查询?
【问题讨论】:
标签: sql random hive hiveql date-range
使用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') 返回 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 中测试。
【讨论】: