在Hive表上执行验证和检查(不能重复)

时间:2019-05-22 14:47:10

标签: hive

我们知道,Hive不会根据字段验证数据,因此用户有责任手动检查数据。 我知道我们可以执行一些基本检查来验证数据。

  1. 计算记录数。
  2. 每列空值的数量
  3. 每列上唯一/不同值的数量
  4. 基于列/数据类型的列级别统计信息(例如最小值,最大值等)
  5. 使用Hive的内置函数to_date和其他函数检查日期列上的验证

我敢肯定,我们还可以执行其他一些检查或验证来验证Hive表上的数据。任何建议都欢迎。

1 个答案:

答案 0 :(得分:1)

不幸的是,您无法为Hive中的每一列生成此查询。像这样手动进行操作,或使用Shell或其他一些工具生成基于描述的表输出:

select count(*)                                 as total_records,
       --repeat these for each column
       count(case when col1 is null then 1 end) as col1_nulls_cnt,
       count(distinct col1)                     as col1_distinct,
       min(col1)                                as col1_min,
       max(col1)                                as col1_max
from your_table;

可以使用cast(col1 as date)验证日期:

select cast(col1 as date) --returns NULL if the date is in wrong format

您可以像第一个查询一样计算由强制转换产生的NULL:

count(case when cast(col1 as date) is null then 1 end) as col1_wrong_dates_cnt

对于更复杂的检查,您可以加入所需的日期范围,该日期范围可以是generated或生成的like this,并检查日期是否加入,例如:

select col1,
       case when d.dt is not null then 'Ok' else 'Wrong date' end date_check 
  from your_table t
  left join date_range d on t.col1=d.d.dt

还可以使用相同的cast()来检查数值/其他原始类型列,例如:https://stackoverflow.com/a/38143497/2700344

关于Hive需要牢记的一件事: 当您在date / timestamp列中插入错误的格式字符串时,Hive将无声地将其无提示地转换为NULL。大多数原始类型都会发生这种情况。但是,如果您尝试将bigint插入int列,则Hive会默默地截断它,并生成一些适合int大小的数字。考虑到所有这些因素,最好在验证之前使用原始数据之上的所有STRING构建表。