我试图从表中获取重复的记录计数,但是对于特定的分区数据不可用,因此配置单元仅打印“OK”结果。
是否可以使用0或NULL之类的值来更改此结果。
是的,尝试使用nvl,COALESCE,case选项仍然显示OK。 AND目标是仅检查重复计数,因此需要至少一个值
select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME
from xyz
where data_dt='20170423'
group by col1,col2
having count(*) >1
最佳答案
由于您使用的是group by
和having
过滤器,因此在空数据集上不会返回任何行。通过不进行分组的方式进行分组,这就是为什么它不返回任何行的原因。没有分组依据且查询返回0:
select nvl(count(*),0) cnt, 'xyz' AS TABLE_NAME
from xyz
where data_dt='20170423'
作为解决方案,当数据集为空时,您可以使用空行UNION ALL
select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME
from xyz
where data_dt='20170423'
group by col1,col2
having count(*) >1
UNION ALL --returns 1 row on empty dataset
select col1, col2, DUPLICATE_ROW_COUNT, TABLE_NAME
from (select null col1, null col2, null AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME
)a --inner join will not return rows when non-empty dataset
inner join (
select count(*) cnt from --should will return 0 on empty dataset
( --your original query
select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME
from xyz
where data_dt='20170423'
group by col1,col2
having count(*) >1
)s --your original query
)s on s.cnt=0
也有可能对您的子查询使用CTE(
WITH
)和WHERE NOT EXISTS
而不是inner join
,但未对其进行测试。您也可以使用shell获取结果并在空值上对其进行测试:
dataset=$(hive -e "set hive.cli.print.header=false; [YOUR QUERY HERE]);
# test on empty dataset
if [[ -z "$dataset" ]] ; then
dataset=0
fi
关于hadoop - 将默认配置单元结果更改为某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43568451/