我们知道,Hive不会根据字段验证数据,因此用户有责任手动检查数据。 我知道我们可以执行一些基本检查来验证数据。
我敢肯定,我们还可以执行其他一些检查或验证来验证Hive表上的数据。任何建议都欢迎。
答案 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构建表。