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

Posted

技术标签:

【中文标题】对 Hive 表执行验证和检查(不能重复)【英文标题】:Perform validation and checks on Hive table (may not be a duplicate) 【发布时间】:2019-05-22 14:47:09 【问题描述】:

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

    统计记录数。 每列的空值数 每列的唯一/不同值的数量 基于列/数据类型的列级统计信息,例如最小值、最大值等 使用 Hive 的内置函数 to_date 和其他函数来检查日期列的验证

我确信我们必须执行更多检查或验证来验证 Hive 表上的数据。欢迎提出任何建议。

【问题讨论】:

【参考方案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://***.com/a/38143497/2700344。

关于 Hive 需要牢记的一件重要事情: 当您在日期/时间戳列中插入错误的格式字符串时,Hive 将无一例外地默默地将其转换为 NULL。大多数原始类型都会发生这种情况。但是,如果您尝试将 bigint 插入 int 列,Hive 会默默地截断它,产生一些适合 int 大小的不同数字。考虑到所有这些,最好在验证之前在原始数据之上构建包含所有字符串的表。

【讨论】:

以上是关于对 Hive 表执行验证和检查(不能重复)的主要内容,如果未能解决你的问题,请参考以下文章

邮箱验证,邮箱不能重复

Hive 分区验证

Hive和传统数据库的区别

数据仓库测试方法

hive 内部表和外部表的区别

使用 laravel 验证检查唯一的日期/时间