【问题标题】:hive - split a row into multiple rows between the range of valueshive - 在值的范围内将一行拆分为多行
【发布时间】:2018-10-02 08:03:40
【问题描述】:

我在下面有一个表格,想按从开始到结束列的范围分割行。

即 id 和 value 应该为 start 和 end(包括两者)之间的每个值重复

--------------------------------------
id      | value   | start     | end
--------------------------------------
1       | 5       | 1         | 4
2       | 8       | 5         | 9
--------------------------------------

期望的输出

--------------------------------------
id      | value   | current
--------------------------------------
1       | 5       | 1
1       | 5       | 2
1       | 5       | 3
1       | 5       | 4

2       | 8       | 5
2       | 8       | 6
2       | 8       | 7
2       | 8       | 8
2       | 8       | 9
--------------------------------------

我可以在 java/python 中编写自己的 UDF 以获得此结果,但想检查我是否可以使用任何现有的 hive UDF 在 Hive SQL 中实现

提前致谢。

【问题讨论】:

    标签: sql apache-spark hadoop hive


    【解决方案1】:

    这可以通过 Hive 不支持的递归公用表表达式来完成。

    一种选择是创建一个数字表并使用它在开始和结束之间生成行。

    create table numbers
    location 'hdfs_location' as 
    select row_number() over(order by somecolumn) as num
    from some_table --this can be any table with the desired number of rows 
    ;
    
    --Join it with the existing table 
    select t.id,t.value,n.num as current
    from tbl t
    join numbers n on n.num>=t.start and n.num<=t.end
    

    【讨论】:

      【解决方案2】:

      您可以使用posexplode() UDF。

      WITH
      data AS (
        SELECT 1 AS id, 5 AS value, 1 AS start, 4 AS `end`
        UNION ALL
        SELECT 2 AS id, 8 AS value, 5 AS start, 9 AS `end`
      )
      SELECT distinct id, value, (zr.start+rge.diff) as `current`
         FROM data zr LATERAL VIEW posexplode(split(space(zr.`end`-zr.start),' ')) rge as diff, x
      

      这是它的输出:

      +-----+--------+----------+--+
      | id  | value  | current  |
      +-----+--------+----------+--+
      | 1   | 5      | 1        |
      | 1   | 5      | 2        |
      | 1   | 5      | 3        |
      | 1   | 5      | 4        |
      | 2   | 8      | 5        |
      | 2   | 8      | 6        |
      | 2   | 8      | 7        |
      | 2   | 8      | 8        |
      | 2   | 8      | 9        |
      +-----+--------+----------+--+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        相关资源
        最近更新 更多