Hive中的序列号UDF

时间:2014-11-12 10:53:13

标签: hadoop hive cloudera

我在hive中尝试过这个UDF: UDFRowSequence
但它没有产生独特的价值,即它依赖于映射器重复序列。
假设我有一个文件(有4条记录)可以在HDFS上使用。它将为这个作业创建一个映射器,结果就像
1
2
3
4
但是当HDFS位置有多个文件(大尺寸)时,将为该作业创建多个映射器,并且对于每个映射器,将生成重复序列号,如下所示 1
2
3
4
1
2
3
4
1
2

是否有任何解决方案,以便为每条记录生成唯一编号

4 个答案:

答案 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