【问题标题】:How to generate a random date from a given range with hive如何使用 hive 从给定范围生成随机日期
【发布时间】:2019-12-04 02:28:49
【问题描述】:

使用蜂巢。我需要生成从给定日期范围中选择的随机日期,介于“2019-01-01”和“2019-10-31”之间。 谁能指导我的查询?

【问题讨论】:

    标签: sql random hive hiveql date-range


    【解决方案1】:

    使用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 中测试。

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2017-10-05
      • 2017-04-21
      • 2017-06-27
      • 2021-09-28
      • 2014-02-25
      相关资源
      最近更新 更多