Hive监控表的数据量,使用analyze

本文介绍了如何使用Hive的ANALYZE TABLE命令来收集和查询表的数据统计信息,包括行数、大小和文件数。这些统计信息存储在metastore中,用于提升查询效率。Hive默认自动收集统计信息,但LOAD DATA操作后需手动执行。通过DESCRIBE FORMATTED命令可以查看统计详情。手动收集时,可以使用NOSCAN选项避免扫描文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hive监控表的数据量,使用analyze

1、使用方式

analyze TABLE td.pt_pmart_ceo_FIN_TRSF_CTR_SITE_MAP partition (dt) COMPUTE STATISTICS  noscan

工作中用到的统计一个表的数据量

# table_counts 查询出传入日期的表的数据量
table_counts=$(hive -e "analyze table ${DB_NAME}.${TABLE_NAME} partition(pt='${P_DATE}') compute statistics;
desc formatted ${DB_NAME}.${TABLE_NAME} partition(pt='${P_DATE}')" | grep numRows | awk '{print $2}')

2、为啥使用:为了统计与分析,他将统计信息存储到metastore中,后续再俩查询的时候就不需要再执行查询计算,可以直接获取

3、适用范围:统计信息支持新建的和现有的表,支持分区表和普通表的统计信息,以及列统计信息。

4、analyz

4.1表统计

行数,大小(字节为单位),文件数

  1. hive是默认自动收集统计信息,有hive.stats.autogather配置参数决定,默认是true。但是对于load data 方式是不支持的。(这个是在计算的时候统计出来的,load是将数据直接放在对应的目录下)

  2. 手动收集。手动收集的指令

    ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], …)]
    COMPUTE STATISTICS
    [FOR COLUMNS] – (Note: Hive 0.10.0 and later.)
    [CACHE METADATA] – (Note: Hive 2.1.0 and later.)
    [NOSCAN];
    

    如果指定了NOSCAN的话,该命令将不会去扫描文件,仅会收集文件数和文件大小的信息

  3. 查看表的统计信息

    desc formatted tableName
    
<think>嗯,用户之前问过关于使用MapReduce进行数据清洗的问题,现在他们又问如何使用Apache Hive进行SQL化的数据清洗。我需要先回想一下Hive和MapReduce的关系。Hive实际上是将SQL查询转换为MapReduce任务,所以用户可能已经了解MapReduce的基础,现在想用更高级的工具简化流程。 用户可能对Hive不太熟悉,但知道它和SQL类似,所以需要从基础开始介绍。首先得解释Hive是什么,以及为什么用它来做数据清洗,比如SQL的易用性,避免编写复杂的Java代码。然后需要分步骤讲解,从数据导入到具体的清洗操作,比如过滤、去重、处理缺失值等。 还要考虑用户可能需要具体的例子,比如创建、加载数据、各种清洗操作的SQL语句示例。需要注意Hive和传统SQL的差异,比如Hive的数据类型、分区、存储格式等。用户可能关心性能优化,比如使用Tez引擎或分区,这些也应该包括在内。 另外,用户之前提到过数据清洗的典型场景,如无效值过滤、格式标准化、去重等,所以在Hive的教程里需要对应这些场景,给出相应的SQL解决方法。可能还需要提到Hive的高级功能,如UDF、事务支持,以及与其他工具如Spark的对比,帮助用户扩展知识。 需要确保回答结构清晰,步骤明确,每个部分都有示例代码,并且指出注意事项和最佳实践,比如避免全扫描、数据验证前置等。最后,总结Hive的优势和适用场景,让用户明白何时选择Hive以及如何进一步学习。</think>Apache Hive SQL化数据清洗教程(分步指南) 一、Hive数据清洗优势 $$HiveQL \approx SQL + Hadoop\ 分布式计算$$ 通过类SQL语法实现MapReduce作业,无需编写Java代码,支持: - 结构化/半结构化数据处理 - 内置200+函数 - ACID事务(Hive 3.x+) - 多种存储格式(ORC/Parquet优化最佳) 二、基础操作流程 1. 创建目标(示例:电商日志清洗) ```sql CREATE EXTERNAL TABLE raw_logs ( user_id STRING, ip STRING, request_time STRING, url STRING ) PARTITIONED BY (dt STRING) STORED AS TEXTFILE LOCATION '/user/hive/warehouse/logs'; ``` 2. 数据加载 ```sql LOAD DATA INPATH '/input/log_20231001.csv' INTO TABLE raw_logs PARTITION (dt='2023-10-01'); ``` 三、典型清洗场景SQL实现 1. 无效值过滤 ```sql INSERT INTO cleaned_logs SELECT user_id, ip, FROM_UNIXTIME(UNIX_TIMESTAMP(request_time, 'dd/MMM/yyyy:HH:mm:ss Z')) AS ts, REGEXP_EXTRACT(url, '^([^?]*)', 1) AS clean_url -- 去除URL参数 FROM raw_logs WHERE LENGTH(user_id) = 32 -- 验证用户ID格式 AND ip RLIKE '^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$' AND dt = '2023-10-01'; ``` 2. 缺失值处理 ```sql SELECT COALESCE(user_id, 'guest') AS user_id, NVL2(email, 'has_email', 'no_email') AS email_status, CASE WHEN age BETWEEN 0 AND 120 THEN age ELSE 30 END AS adjusted_age FROM user_profiles; ``` 3. 重复数据去重 ```sql CREATE TABLE dedup_logs AS SELECT DISTINCT * FROM ( SELECT user_id, ip, MIN(request_time) OVER (PARTITION BY user_id, ip) AS first_occurrence FROM raw_logs ) tmp; ``` 四、进阶清洗技术 1. 正则达式清洗 ```sql SELECT REGEXP_REPLACE(comment, '[^\\x00-\\x7F]', '') AS ascii_comment, -- 去除非ASCII字符 REGEXP_EXTRACT(phone, '(\\d{3})-\\d{3}-\\d{4}', 1) AS area_code FROM customer_contacts; ``` 2. UDF自定义函数 ```java // 编写Java UDF public class GeoHashUDF extends UDF { public Text evaluate(Text lat, Text lon) { // 生成geohash编码 return new Text(Geohash.encode(lat.toString(), lon.toString())); } } ``` ```sql ADD JAR /path/to/geohash-udf.jar; CREATE TEMPORARY FUNCTION geo_hash AS 'com.example.GeoHashUDF'; SELECT ip, geo_hash(latitude, longitude) AS geohash FROM access_logs; ``` 五、性能优化方案 1. 存储格式优化 ```sql CREATE TABLE optimized_logs ( user_id STRING, ip STRING ) STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY"); ``` 2. 分区与分桶 ```sql CREATE TABLE log_partitions ( user_id STRING, event_time TIMESTAMP ) PARTITIONED BY (country STRING) CLUSTERED BY (user_id) INTO 32 BUCKETS; ``` 3. 执行引擎切换 ```sql SET hive.execution.engine=tez; -- 替换默认MapReduce引擎 ``` 六、质量监控方法 1. 数据质量检查视图 ```sql CREATE VIEW data_quality AS SELECT dt, COUNT(*) AS total, SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS null_users, SUM(CASE WHEN ip NOT RLIKE '^\\d+\\.\\d+\\.\\d+\\.\\d+$' THEN 1 ELSE 0 END) AS invalid_ips FROM raw_logs GROUP BY dt; ``` 2. 异常数据导出 ```sql INSERT OVERWRITE DIRECTORY '/output/bad_records' SELECT * FROM raw_logs WHERE user_id IS NULL OR ip IS NULL; ``` 七、最佳实践建议 1. 清洗流程设计 $$原始数据 \rightarrow 临时(Raw) \rightarrow 中间(Cleaned) \rightarrow 目标(Mart)$$ 2. 避免全扫描 - 使用分区字段作为过滤条件 - 对常用筛选字段建立索引 3. 版本控制 ```sql ALTER TABLE cleaned_logs SET TBLPROPERTIES ('version'='1.2'); ``` 扩展应用: - 结合Hive LLAP实现亚秒级响应 - 使用Hive Streaming对接Python/R脚本 - 通过Hive Hook实现审计跟踪 注意事项: 1. 字符串处理注意编码问题(推荐UTF-8) 2. 大JOIN使用MAPJOIN优化 3. 定期执行ANALYZE TABLE更新统计信息 迁移建议: - 每日处理量<1TB时优先使用Hive - 实时性要求高时考虑Spark SQL - 复杂流水线可结合Airflow调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥TuNan&Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值