Hadoop 用于基于多个可选键分配分组键的配置单元查询

Hadoop 用于基于多个可选键分配分组键的配置单元查询,hadoop,hive,mapreduce,hadoop2,Hadoop,Hive,Mapreduce,Hadoop2,我们有一个包含三个不同ID的配置单元表,都是可选的。在每行中,必须至少提供三个ID中的一个。如果提供了多个ID,这将在多个ID之间建立等效性 我们需要根据任何一行中建立的等价性,为每一行分配一个唯一的主ID。例如: Line id1 id2 id3 masterID -------------------------------------- (1) A1 M1 (2) A2 M

我们有一个包含三个不同ID的配置单元表,都是可选的。在每行中,必须至少提供三个ID中的一个。如果提供了多个ID,这将在多个ID之间建立等效性

我们需要根据任何一行中建立的等价性,为每一行分配一个唯一的主ID。例如:

Line   id1     id2     id3    masterID
--------------------------------------
(1)    A1                     M1
(2)            A2             M1
(3)                    A3     M1
(4)    A1      A2             M1
(5)            A2      A3     M1
(6)    B1      A2             M1
(7)    C1              C3     M2
因为在第4行中,A1和A2都存在,我们知道这些ID是等效的

同样,在第5行,A2和A3都存在,我们知道这些ID也是等效的

同样在第6行,我们有B1和A2,所以它们也是等价的

在第7行,我们得到了C1和C3之间的等价关系

鉴于上述信息,A1、A2、A3和B1都是等效的。因此,包含任何这些ID的所有行都必须分配相同的主ID,因此我们为它们提供了相同的主ID(“M1”)。第7行接收一个唯一的ID(“M2”),因为它的两个ID都不匹配任何其他ID


我们如何编写配置单元查询以这种方式分配主ID?如果Hive不是实现这一点的最佳工具,您能否建议使用Hadoop生态系统中的其他工具为这些行分配主ID?

您可以通过将ID表示为顶点并查找连接的组件来解决此问题。关于这个想法的更多信息,请参见第3.5节。让
init_table
为您的表。首先,构建一个链接表

create table links as
select distinct id1 as v1, id2 as v2
  from init_table
 where id1 is not null and id2 is not null
union all 
select distinct id1 as v1, id3 as v2
  from init_table
 where id1 is not null and id3 is not null
union all 
select distinct id2 as v1, id3 as v2
  from init_table
 where id2 is not null and id3 is not null
;
接下来,为每个链接生成一些编号,例如行编号并执行传播:

create table links1 as
with temp_table as (
  select v1, v2, row_number() over () as score
    from links
)
, tbl1 as (
  select v1, v2, score
       , max(score) over (partition by v1) as max_1
       , max(score) over (partition by v2) as max_2
    from temp_table
)
select v1, v2, greatest(max_1, max_2) as unique_id
  from tbl1
; 
然后只需将您的ID与匹配表连接起来:

create table matching_table as
with temp_table as (
select v1 as id, unique_id
  from link1
union all
select v2 as id, unique_id
  from link1
)
select distinct id, unique_id
  from temp_table
如果一些ID没有耦合,那么就不难找到哪些ID。
希望这能有所帮助。

上述解决方案似乎很有希望,但很容易找到不起作用的方案。我们试图添加条款来覆盖剩余的未发现的等价物,但总是有更多。最后,我编写了一个Java应用程序,使用映射和集合的组合来实现这一点。数百万行耦合ID的性能并不太差。只是出于好奇,你能给我一个这样的例子吗?只是为了确保我没有遗漏什么,因为连接组件的方法对于这个任务来说似乎是合理的。