hive查询根据多个可选键分配分组键

iih3973s  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(404)

我们有一个配置单元表,有三个不同的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?

gz5pxeao

gz5pxeao1#

可以通过将ID表示为顶点并查找连接的组件来解决此问题。关于这个想法的更多信息,请参见第3.5节。让 init_table 这是你的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。希望这有帮助。

相关问题