所有属性的 null 和 not null 的分析值计数

Posted

技术标签:

【中文标题】所有属性的 null 和 not null 的分析值计数【英文标题】:Profiling values for null and not null count on all attributes 【发布时间】:2021-04-07 02:32:57 【问题描述】:

我有一个表,它使用 hive / sql 在下表中具有例如 3 个属性 我有一个用例,其中包含 50 多个属性,这些属性要求我对此值 nullcount、notnull 等进行分析,根据当前用例,我无法使用 pyspark/plsql 进行任何数据转换路障

出于演示目的,假设我有 3 个属性,只需要 2 个表的 notnull 计数,马来西亚和泰国

describe malaysia

ColumnName |  Datatype
custid     |  String
productid  |  String
addressid  |  String

describe thailand

ColumnName |  Datatype
custid     |  String
productid  |  String
addressid  |  String

按照我目前的方法,我就是这样做的,

select COUNT(CASE WHEN custid IS NOT NULL then 1 ELSE NULL END) as "NullCount",
COUNT(CASE WHEN productid IS NOT NULL then 1 ELSE NULL END) as "NullCount",
COUNT(CASE WHEN addressid IS NOT NULL then 1 ELSE NULL END) as "NullCount" 
from malaysia 
union
select COUNT(CASE WHEN custid IS NOT NULL then 1 ELSE NULL END) as "NullCount",
COUNT(CASE WHEN productid IS NOT NULL then 1 ELSE NULL END) as "NullCount",
COUNT(CASE WHEN addressid IS NOT NULL then 1 ELSE NULL END) as "NullCount" 
from thailand

知道我每个表有超过 50 个属性,查询会很长,我觉得它不是正确的方法,因为维护会变得混乱和困难。我想知道是否有更好的方法来产生相同的结果。

【问题讨论】:

修复你的数据模型!这是根本问题。您不应该将数据存储在多个表中,就像在同一个表中存储多行一样。 【参考方案1】:

修复您的数据模型!您应该将所有数据放在一个单个 表中,其中有一列是country。然后你可以简单地这样做:

select country,
       count(custid) as custid_not_null,
       count(productid) as productid_not_null,
       count(addressid) as addressid_not_null
from all_countries
group by country ;

请注意,count(<expression>) 计算表达式的非NULL 值的数量。 case 表达式完全是多余的。

如果不这样做,您可以创建一个视图:

create view all_counties as
    select 'malaysia' as country, t.*
    from malaysia m
    union all
    select 'thailand' as country, t.*
    from thailand t
    union all
    . . .;

但我建议您将所有数据放在一个表中。

【讨论】:

我已经对我的数据进行了重组。但是,我在一个按国家/地区分区的表中有 100 多个属性,但我可以使用 group by 子句。我想知道是否有任何语句可以让我选择所有属性作为列而不是查询' select as_of_date as columnname ... union select currency as colummane 等。 拥有 100 个属性,而不是像您给出的示例那样一一指定,count(custid) as custidnotnull.. count product id as productnotnull...,我们是否可以在一行中查询为所有属性提供空记录? @FAves 。 . .将所有数据放在一张表中!修复数据模型。【参考方案2】:

您需要稍微更改一下您的 sql。而不是计数使用总和。我添加了总数以便更好地分析。我没有任何简单的方法,但您可以将列列表放入 XL 中并从中创建一个公式,该公式将自动创建此字符串 SUM(CASE WHEN custid IS NOT NULL then 1 ELSE 0 END) as "Nullcustid"

select 
COUNT(*) "TotalCount",
SUM(CASE WHEN custid IS NOT NULL then 1 ELSE 0 END) as "NullCust",
SUM(CASE WHEN productid IS NOT NULL then 1 ELSE  0 END) as "Nullprod",
SUM(CASE WHEN addressid IS NOT NULL then 1 ELSE 0 END) as "Nulladdress" 
from malaysia 
union
select 
COUNT(*) "TotalCount",
SUM(CASE WHEN custid IS NOT NULL then 1 ELSE 0 END) as "NullCust",
SUM(CASE WHEN productid IS NOT NULL then 1 ELSE  0 END) as "Nullprod",
SUM(CASE WHEN addressid IS NOT NULL then 1 ELSE 0 END) as "Nulladdress" 
from thailand

【讨论】:

以上是关于所有属性的 null 和 not null 的分析值计数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中建表时可空(NULL)和非空(NOT NULL)的一些思考

CoreData:Not null 属性应该是可选的吗?

org.hibernate.PropertyValueException:not-null属性引用null或transient值:com.Attendance.Batch.BCode

全网首发:跟踪分析This parser does not support specification “null“ version “null“

MySQL字段的属性应该尽量设置为NOT NULL

sql中 null 的坑(not in 子查询内有 null ,则判断都为 false)