我必须从Hive表中提取数据,并且还需要为Hive中的每个记录生成序列号。与多个表连接后,还需要提取不同的记录。
[请帮助我获得这些解决方案。预先谢谢你。
与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
结果:
:可以使用DISTINCT关键字,或者如果使用不同的条件来获取相同的数据,请使用UNION。+--------+---------+-----+ | 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 | +--------+---------+-----+
用于不同的记录