跳至主要内容

如何计算表中每列的空值/零值比例

·阅读时间:2 分钟

如果一列是稀疏的(为空或主要包含零),ClickHouse 可以以稀疏格式对其进行编码,并自动优化计算——在查询期间,数据不需要完全解压缩。事实上,如果您知道一列的稀疏度,可以使用 ratio_of_defaults_for_sparse_serialization 设置 来定义它的比率,以优化序列化。

此便捷的查询可能需要一段时间才能完成,但它会分析表中的每一行,并确定指定表中每一列中为零(或默认值)的值的比例

SELECT *
APPLY x -> (x = defaultValueOfArgumentType(x)) APPLY avg APPLY x -> round(x, 3)
FROM table_name
FORMAT Vertical

例如,我们在上面的 环境传感器数据集 表(名为 sensors)上运行了此查询,该表包含超过 200 亿行和 19 列

SELECT *
APPLY x -> (x = defaultValueOfArgumentType(x)) APPLY avg APPLY x -> round(x, 3)
FROM sensors
FORMAT Vertical

以下是响应


Row 1:
──────
round(avg(equals(sensor_id, defaultValueOfArgumentType(sensor_id))), 3): 0
round(avg(equals(sensor_type, defaultValueOfArgumentType(sensor_type))), 3): 0.159
round(avg(equals(location, defaultValueOfArgumentType(location))), 3): 0
round(avg(equals(lat, defaultValueOfArgumentType(lat))), 3): 0.001
round(avg(equals(lon, defaultValueOfArgumentType(lon))), 3): 0.001
round(avg(equals(timestamp, defaultValueOfArgumentType(timestamp))), 3): 0
round(avg(equals(P1, defaultValueOfArgumentType(P1))), 3): 0.474
round(avg(equals(P2, defaultValueOfArgumentType(P2))), 3): 0.475
round(avg(equals(P0, defaultValueOfArgumentType(P0))), 3): 0.995
round(avg(equals(durP1, defaultValueOfArgumentType(durP1))), 3): 0.999
round(avg(equals(ratioP1, defaultValueOfArgumentType(ratioP1))), 3): 0.999
round(avg(equals(durP2, defaultValueOfArgumentType(durP2))), 3): 1
round(avg(equals(ratioP2, defaultValueOfArgumentType(ratioP2))), 3): 1
round(avg(equals(pressure, defaultValueOfArgumentType(pressure))), 3): 0.83
round(avg(equals(altitude, defaultValueOfArgumentType(altitude))), 3): 1
round(avg(equals(pressure_sealevel, defaultValueOfArgumentType(pressure_sealevel))), 3): 1
round(avg(equals(temperature, defaultValueOfArgumentType(temperature))), 3): 0.532
round(avg(equals(humidity, defaultValueOfArgumentType(humidity))), 3): 0.544

1 row in set. Elapsed: 992.041 sec. Processed 20.69 billion rows, 1.39 TB (20.86 million rows/s., 1.40 GB/s.)

从上面的结果

  • sensor_id 列根本不是稀疏的。事实上,每一行都包含一个非零值
  • sensor_type 列仅约 15.9% 的时间是稀疏的
  • P0 列非常稀疏:99.9% 的值为零
  • pressure 列的稀疏度为 83%
  • temperature 列有 53.2% 的值为缺失或零

正如我们所说,这是一个计算 ClickHouse 表中列稀疏度的便捷查询!