配置单元 - 在值范围之间将行拆分为多行

时间:2018-04-22 00:24:01

标签: sql apache-spark hadoop hive

我在下面有一个表格,并希望按行从开始到结束列的范围进行拆分。

,对于start和amp;之间的每个值,应重复id和value。结束(包括在内)

--------------------------------------
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来获得此结果,但是想检查我是否可以使用任何现有的配置单元UDF在Hive SQL中实现

提前致谢。

2 个答案:

答案 0 :(得分:0)

这可以使用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

答案 1 :(得分:0)

您可以使用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        |
+-----+--------+----------+--+