【问题标题】:Hive QL to populate a sequence of numbers between limitsHive QL 填充限制之间的数字序列
【发布时间】:2019-08-19 04:02:18
【问题描述】:

不知道如何直截了当地说,但我正在尝试在 Hive SQL 中做一些事情。我需要创建一个从下限到上限的数字序列。

例如: select min(year) from table

假设它的结果是2010

select max(year) from table

假设它的结果是2015

我需要在选择查询中每年从2010 发布到2015

我正在尝试将 min 计算和 max 计算放在同一个 SQL 中,这将/应该在输出中创建连续年份。

有什么想法吗?

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

    我有一个想法,但为了使用它,您必须为表中可能存在的年份定义可能的最低值和可能的最大值。

    假设最小的年份是 1900 年,最大的年份是 2200 年。
    由于这种情况下最大的可能差异是2200-1900=300,因此您必须使用以下字符串:0 1 2 3 4 5 6 7 8 9 10 11 12 13 ... ... 298 299 300

    在查询中,您使用空格作为分隔符拆分此字符串,从而得到一个数组,然后分解该数组。
    看看:

    SELECT
      minval + delta
    
    FROM
      (
        SELECT
           min(year) minval,
           max(year) maxval,
           split('0 1 2 3 4 5 6 7 8 9 10 11 12 13 ... ... ... 298 299 300', ' ') delta_list
        FROM
        table
      ) t
      LATERAL VIEW explode(delta_list) dlist AS delta
    
    WHERE (maxval-minval) >= delta 
    ;
    

    所以你最终得到 301 行,但你只需要 delta 值不超过最大年份和最小年份之间差异的行,这反映在 where 子句中

    【讨论】:

      【解决方案2】:
      set hivevar:end_year=2019;
      set hivevar:start_year=2010;
      
      select ${hivevar:start_year}+i as year
      from
      (
      select posexplode(split(space((${hivevar:end_year}-${hivevar:start_year})),' ')) as (i,x)
      )s;
      

      结果:

      year    
      
      2010    
      2011    
      2012    
      2013    
      2014    
      2015    
      2016    
      2017    
      2018    
      2019    
      

      还可以查看this 关于生成缺失日期的答案。

      【讨论】:

        猜你喜欢
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 1970-01-01
        • 2012-02-25
        • 2014-11-14
        相关资源
        最近更新 更多