【问题标题】:compare data between two tables with same structure in hive比较配置单元中具有相同结构的两个表之间的数据
【发布时间】:2018-07-06 09:25:33
【问题描述】:

如何在 hive 中比较两个具有相同结构的表。我相信减号在蜂巢中不起作用。

SRC 表:

id name
1   A
2   B
3   C

TGT 表:

身份证名称

1   A
2   C
3   C

谁能帮我查询一下。

【问题讨论】:

    标签: sql hive hiveql


    【解决方案1】:

    如果您正在寻找两个表之间的相等性和差异(如果有),您可以执行以下操作

    SELECT MIN(TableName) as TableName, ID, NAME FROM ( SELECT 'SRC_TABLE' as TableName, A.ID, A.NAME FROM A UNION ALL SELECT 'TGT_TABLE' as TableName, B.ID, B.NAME FROM B ) tmp GROUP BY ID, NAME HAVING COUNT(*) = 1 ORDER BY ID

    上述查询的作用基本上如下,

    • 合并两个表中的所有记录并按所有列对它们进行分组。稍后仅打印出那些唯一的记录 [count(*) = 1]。

    • 如果上述查询打印零记录,则表示两个表完全相等

    • 如果上述查询打印了任何记录,则意味着这些特定记录不存在于一个或其他表中
    • 对于上面你列出的例子,输出如下,

      [ TBL_NAME | ID | NAME ]

      ----------------------------

      [ SRC_TABLE | 2 | B ]

      [ TGT_TABLE | 2 | C ]

    致谢:我从website 中找到了上述解决方案。我试过了,太棒了!

    【讨论】:

    • 考虑下表A和B,在hive中是合法的。Table A :id:1 name:A; id:1 name:A ,表 B:什么都没有。这个 sql 会给你错误的答案。所以你不能在 Hive 中使用这个 sql。
    【解决方案2】:
    select      id
               ,SRC_name
               ,TGT_name
    
    from       (select      id
                           ,min   (case tab when 'S' then name end) as SRC_name
                           ,min   (case tab when 'T' then name end) as TGT_name
                           ,count (case tab when 'S' then 1    end) as SRC_count 
                           ,count (case tab when 'T' then 1    end) as TGT_count 
    
                from        (           select 'S' as tab,id,name from SRC
                            union all   select 'T' as tab,id,name from TGT
                            ) t
    
                group by    id  
                ) t
    
    having      SRC_count = 0
            or  TGT_count = 0
            or  SRC_name != TGT_name
    ;
    

    如果name 可能为NULL 或id 可能不唯一,则应添加附加条件

    【讨论】:

    • 感谢@Dudu 的解决方案。
    【解决方案3】:

    要对 2 个表进行全面比较,我的经验告诉我,使用一些校验和机制是比加入表更有效和可靠的解决方案(例如,当键重复时会带来一些困难)。

    您可以查看这个处理 Hive 表比较(比较所有行和所有列)的 Python 程序,并会在网页中向您显示可能出现的差异:https://github.com/bolcom/hive_compared_bq

    【讨论】:

      【解决方案4】:

      有一个免费工具 (dataq.io) 可用于比较 hive 中两个表之间的数据。它可以直观地显示差异。

      免责声明:我为 dataq.io 工作

      【讨论】:

        【解决方案5】:

        Hive 中不存在减号。您可以使用左连接或完全连接从两个表中查找不同的记录。

        LEFT JOIN: - 允许查找 TGT 中不存在的记录

        select a.id, a.name 
          from TGT a left join TGT b on a.id=b.id and a.name=b.name
        where b.id is null
        

        同样可以使用NOT EXISTS实现

        select a.id, a.name 
              from TGT a 
        where not exists(select 1 from  TGT b where a.id=b.id and a.name=b.name)
        

        FULL JOIN: - 允许从两个表中查找差异

        select a.id as SRC_ID, a.name as SRC_NAME ,
               b.id as TGT_ID, b.name as TGT_NAME
          from TGT a full join TGT b on a.id=b.id and a.name=b.name
        where a.id is null OR b.id is null
        

        【讨论】:

        • 感谢您的解决方案。但我也想要 id 不匹配且名称不匹配的数据
        • 您的数据示例的预期结果是什么?
        • 我的左连接查询将返回2 B。对吗?
        • 是的,那么如果我想比较所有字段,我需要将左外连接中的所有文件都赋予右。例如我有 20 个字段,那么,我需要在左连接中添加所有字段吗
        • 是的,您需要在JOIN ON条件中添加所有要比较的字段
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多