2017-03-03 8 views
1

2つの表の内の1つの列の一意の値に対する2つの表のINNER JOINに起因する列間の一致をカウントしようとしています。例では、物事をより明確にすることがあります。ハイブ:列の一意の値に対するINNER JOINの一致数が一致しました

私は、次の2つのテーブルを持っていた場合:[1,2,3]およびそれらに関連info_A['a','b','c','d']

Table A 
------- 
id_A: info_A 
1  'a' 
2  'b' 
3  'c' 
3  'd' 

Table B 
------- 
id_B: info_B 
1  'a' 
3  'c' 
5  'b' 

私はユニークid_Aを見つけたいです。

私は、次のような表を作成したい:

match_cntが与えられた id_Aため info_Ainfo_B間の一致の数です
Table join of A+B 
----------------- 
id_A: info_A id_B info_B match_cnt 
1  'a'  1  'a'  1 
3  'c','d' 3  'c'  0.5 

。参考までに、私が実際に使っているテーブルには何十億もの行があります。

コードチャンクは、私が試した内容を示し、プラスの変化(以下に示されていない):

SELECT z.id_A, z.info_A, z.id_B, z.info_B 
FROM(
    SELECT u.id_A AS id_A, u.info_A AS info_A, y.id_B AS true_id_B, y.info_B AS true_info_B 
    FROM db.table_A u 
    WHERE EXISTS 
     (SELECT id_B, info_B 
     FROM table_B l 
     where l.id_B= u.id_A) 
    INNER JOIN table_B y 
    ON u.id_A = y.id_B 
    ) z 

答えて

0
select  id 
      ,collect_list (case when a=1 then info end)     as info_a 
      ,collect_list (case when b=1 then info end)     as info_b 
      ,count  (case when a=1 and b=1 then 1 end)/count(*) as match_cnt 

from  (select  id 
         ,info 
         ,min (case when tab = 'A' then 1 end) as a 
         ,min (case when tab = 'B' then 1 end) as b 

      from  (   select 'A' as tab ,id_A as id ,info_A as info from A 
         union all select 'B' as tab ,id_B as id ,info_B as info from B 
         ) t 

      group by id 
         ,info 
      ) t 

group by id 

having  min(a) = 1 
     and min(b) = 1 
; 

+----+-----------+--------+-----------+ 
| id | info_a | info_b | match_cnt | 
+----+-----------+--------+-----------+ 
| 1 | ["a"]  | ["a"] | 1.0  | 
| 3 | ["c","d"] | ["c"] | 0.5  | 
+----+-----------+--------+-----------+ 
+0

データサンプルの結果が更新されました –

0

あなたは、以下のようないくつかのことを使用することができます: -

WITH T1 AS (select ID_A ,count(1) as cnt from tableA inner join tableB on tableA.ID_A=tableB.ID_B and tableA.INFO_A=tableB.INFO_B group by ID_A,INFO_A) 

     select distinct tmp.ID_A,tmp.a,tmp.ID_B,tmp.b, (cnt/size(a)) from 

     (select ID_A ,collect_set(INFO_A) as a,ID_B,collect_set(INFO_B) as b from tableA inner join tableB on tableA.a=tableB.a group by tableA.a,tableB.a) 

tmp join T1 on T1.ID_A=tmp.ID_A 
関連する問題