将表统计信息插入另一表:Teradata/Hive表统计生成与插入需求
实现方案(Teradata + Hive 版本)
一、先准备统计信息表(如果尚未创建)
咱们得先有个专门存统计结果的表,字段要和你要生成的统计项匹配,我帮你定义好适配两种数据库的结构:
Teradata 版本
CREATE MULTISET TABLE DP_S.stats_table , NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO ( testing_table VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC, noofrows NUMBER(30), min_id INTEGER, max_id INTEGER, null_id_count NUMBER(30) -- 用来统计id为空的行数 ) NO PRIMARY INDEX;
Hive 版本
Hive语法更简洁,适配一下存储格式和数据类型:
CREATE TABLE IF NOT EXISTS DP_S.stats_table ( testing_table STRING, noofrows BIGINT, min_id INT, max_id INT, null_id_count BIGINT ) STORED AS ORC; -- 也可以根据需求换成Parquet等其他格式
二、生成统计信息并插入
接下来补全你没写完的统计逻辑,直接用「查询+插入」的语句一步完成:
Teradata 版本
INSERT INTO DP_S.stats_table SELECT 'temp_a' AS testing_table, CAST(COUNT(*) AS NUMBER(30)) AS noofrows, MIN(id) AS min_id, MAX(id) AS max_id, SUM(CASE WHEN id IS NULL THEN 1 ELSE 0 END) AS null_id_count -- 统计id为空的记录数 FROM DP_S.temp_a;
Hive 版本
Hive语法类似,注意数据类型的适配(用BIGINT对应Teradata的NUMBER(30)):
INSERT INTO TABLE DP_S.stats_table SELECT 'temp_a' AS testing_table, CAST(COUNT(*) AS BIGINT) AS noofrows, MIN(id) AS min_id, MAX(id) AS max_id, SUM(CASE WHEN id IS NULL THEN 1 ELSE 0 END) AS null_id_count FROM DP_S.temp_a;
三、额外实用小提示
- 如果需要每次统计都覆盖
temp_a的旧统计记录:Teradata可以用INSERT ... WITH REPLACE,Hive换成INSERT OVERWRITE TABLE即可。 - 要是
temp_a是超大表:Teradata可以加表统计信息或者用SAMPLE做近似统计(允许误差的话);Hive记得加分区过滤,避免全表扫描浪费资源。
内容的提问来源于stack exchange,提问作者orak
相关产品推荐
相关产品推荐

