我在hive中尝试过这个UDF: UDFRowSequence 。
但它没有产生独特的价值,即它依赖于映射器重复序列。
假设我有一个文件(有4条记录)可以在HDFS上使用。它将为这个作业创建一个映射器,结果就像
1
2
3
4
但是当HDFS位置有多个文件(大尺寸)时,将为该作业创建多个映射器,并且对于每个映射器,将生成重复序列号,如下所示
1
2
3
4
1
2
3
4
1
2
。
是否有任何解决方案,以便为每条记录生成唯一编号
答案 0 :(得分:2)
我认为您正在寻找ROW_NUMBER()
。你可以阅读它和其他"窗口"函数here。
示例:强>
SELECT *, ROW_NUMBER() OVER ()
FROM some_database.some_table
答案 1 :(得分:0)
@ GoBrewers14: - 是的,我确实尝试过。我们尝试使用ROW_NUMBER函数,但是当我们尝试在小尺寸数据上查询时,例如。包含500行的文件,它工作得很好。但是当谈到大尺寸数据时,查询会运行几个小时,最终无法生成输出。
我已经知道以下有关此事的信息: - 使用简单UDF无法在分布式处理查询中生成顺序。这是因为该方法需要一些集中实体来跟踪计数器,这也会导致分布式查询严重低效,不建议应用。
答案 2 :(得分:0)
如果您想使用多个映射器和大型数据集,请尝试使用此UDF:https://github.com/manojkumarvohra/hive-hilo
它使用zookeeper作为维护序列状态的中央存储库
答案 3 :(得分:0)
查询以生成序列。我们也可以将其用作维度表中的代理键。
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