对 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 表执行验证和检查(不能重复)的主要内容,如果未能解决你的问题,请参考以下文章