蜂巢提取中的序列号生成

问题描述 投票:-1回答:1

我必须从Hive表中提取数据,并且还需要为Hive中的每个记录生成序列号。与多个表连接后,还需要提取不同的记录。

[请帮助我获得这些解决方案。预先谢谢你。

hiveql
1个回答
-1
投票

与Oracle或其他关系数据库一样,配置单元中没有Sequence对象,但是有多种方法可以实现。

1。 UDFRowSequence

:但是使用它有一个缺点,如果您有1个以上的映射器,它将为您提供重复的序列。为了使用此功能,您必须在作业中将映射器的生成限制为1。

2。 [使用窗口功能

:我们可以使用窗口功能生成序列号。您可以阅读有关它以及其他“窗口”功能here的信息。

输入数据

+--------+---------+-----+
| col_id | col_val | seq |
+--------+---------+-----+
| dft    | col_y   |   1 |
| idx    | col_a   |   2 |
| yhc    | col_b   |   3 |
| cde    | col_x   |   4 |
| bdf    | col_f   |   5 |
| axc    | col_x   |   6 |
+--------+---------+-----+

查询以生成序列。我们也可以将其用作维度表中的代理键。

WITH TEMP AS
  (SELECT if(max(seq) IS NULL, 0, max(seq)) max_seq
   FROM seq_test)
SELECT col_id,
       col_val,
       row_number() over() + max_seq AS seq
FROM souce_table
INNER JOIN TEMP ON 1 = 1;
seq_test: Its your target table.
source_table: Its your source.
Seq: Surrogate key / Sequence number / Key column

结果:

+--------+---------+-----+
| col_id | col_val | seq |
+--------+---------+-----+
| dft    | col_y   |   7 |
| idx    | col_a   |   8 |
| yhc    | col_b   |   9 |
| cde    | col_x   |  10 |
| bdf    | col_f   |  11 |
| axc    | col_x   |  12 |
| dft    | col_y   |   1 |
| idx    | col_a   |   2 |
| yhc    | col_b   |   3 |
| cde    | col_x   |   4 |
| bdf    | col_f   |   5 |
| axc    | col_x   |   6 |
+--------+---------+-----+

用于不同的记录

:可以使用DISTINCT关键字,或者如果使用不同的条件来获取相同的数据,请使用UNION
© www.soinside.com 2019 - 2024. All rights reserved.