hadoop - 将默认配置单元结果更改为某些值

标签 hadoop hive apache-spark-sql

我试图从表中获取重复的记录计数,但是对于特定的分区数据不可用,因此配置单元仅打印“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 byhaving过滤器,因此在空数据集上不会返回任何行。通过不进行分组的方式进行分组,这就是为什么它不返回任何行的原因。没有分组依据且查询返回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/

相关文章:

regex - Hive:字符串中的第一次和最后一次出现

hadoop - HBase的主无法启动

java - 如何在 Hadoop 的 Map Reduce 中执行 perl 程序?

hadoop - 在 Hadoop Hive 中解码原始 URL,更喜欢非 Java 解决方案

scala - 编写 spark UDF(而不是将 UDF 作为一个)时是否会降低性能?

apache-spark - 查找 pyspark 中行字符串中的日期之间的平均时间和总时间?

hadoop - 无法将HDFS与URI连接

hadoop - 如何设置动态分区,其中列键将是分区

hadoop - Hive 通过删除重复项来连接两个表

scala - 如何使用在 Scala 中创建数据集的通用案例类实现特征