Hive表验证

时间:2017-03-19 16:39:29

标签: hive hiveql

我有一个带有一些记录的蜂巢表。 我使用脚本验证表,结果存储在另一个表中。 基本上我必须得到这两个表的计数,并找到差异。 然后将差值与阈值进行比较。

根据该结果,表格将用于分析或拒绝。

阈值是表格可以包含的不良记录的度量。

实施例: - 假设表A有100条记录。 验证记录,有效记录存储在另一个表B中。 假设表B有70条记录。 所以差异是100-70 = 30.

我们假设阈值为20(表示最多可存在20条不良记录), 所以在这种情况下,表格将被拒绝。

如何执行此操作?

1 个答案:

答案 0 :(得分:1)

如果hive.stats.autogather设置为true,则表格统计信息会自动收集,包括numRows
在这种情况下,您所要做的就是检查统计数据并做出您想要的决定。

如果不是,则只执行2 select count(*)次查询,例如 -

src_numRows=$(hive -e "select count(*) from src")
trg_numRows=$(hive -e "select count(*) from trg")

P.S。

可以完成一个查询,但我认为除了diff之外保存原始结果会更好。

select  s.cnt - t.cnt   as diff

from                (select count(*) as cnt from src) s 
        cross join  (select count(*) as cnt from trg) t
;

演示

创建源表

create table src 
as 
select  i+1 as n
from    (select 1) x lateral view posexplode(split(space(100-1),' ')) pe as i,x
;

创建目标表

create table trg 
as 
select  * 
from    src
where   n > 30
;

检查表格统计信息

<强>的bash

src_numRows=$(hive -e "show tblproperties src ('numRows')")
trg_numRows=$(hive -e "show tblproperties trg ('numRows')")

printf "src:%g,trg:%g,diff:%g\n" ${src_numRows} ${trg_numRows} $((src_numRows-trg_numRows))
  

的src:100,TRG:70,DIFF:30

另一种选择是直接从metasotre

检查统计数据

<强>的MySQL

select  t.TBL_NAME
       ,tp.PARAM_VALUE 

from            DBS             d 

        join    TBLS            t   
        on      t.DB_ID = d.DB_ID 

        join    TABLE_PARAMS    tp  
        on      tp.TBL_ID = t.TBL_ID 

where   d.NAME = 'default' 
    and t.TBL_NAME in ('src','trg') 
    and tp.PARAM_KEY = 'numRows'
;
+----------+-------------+
| TBL_NAME | PARAM_VALUE |
+----------+-------------+
| src      | 100         |
| trg      | 70          |
+----------+-------------+