配置单元中的序列号udf

igsr9ssn  于 2021-05-30  发布在  Hadoop
关注(0)|答案(4)|浏览(353)

我在 hive 里试过这个自定义项:udfrowsequence。
但它不会产生唯一的值,即根据Map器重复序列。
假设我有一个文件(有4条记录)在hdfs中可用,它将为此作业创建一个Map器,结果如下
1
2
3
4
但当hdfs位置有多个文件(大尺寸)时,将为该作业创建多个Map器,并为每个Map器生成重复序列号,如下所示
1
2
3
4
1
2
3
4
1
2
.
是否有任何解决方案,以便为每个记录生成唯一的编号

oxiaedzo

oxiaedzo1#

我想你在找 ROW_NUMBER() . 你可以在这里了解它和其他“窗口”功能。
例子:

SELECT *, ROW_NUMBER() OVER ()
FROM some_database.some_table
cig3rfwq

cig3rfwq2#

如果要使用多个Map器和大型数据集,请尝试使用以下自定义项:https://github.com/manojkumarvohra/hive-hilo
它利用zookeeper作为中央存储库来维护序列状态

mm5n2pyu

mm5n2pyu3#

@是的,我试过了。
我们尝试使用row\u number函数,但是当我们尝试在小尺寸数据(例如包含500行的文件)上查询时,它工作得非常好。但当涉及到大数据时,查询会运行几个小时,最终无法生成输出。
我了解到以下信息:
使用简单的udf无法在分布式处理查询中生成顺序。这是因为这种方法将需要一些集中的实体来跟踪计数器,这也将导致分布式查询的严重低效,因此不建议应用。

hgb9j2n6

hgb9j2n64#

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

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

相关问题