Hive常用的SQL命令操作

本文介绍了如何使用Hive SQL进行表的创建、修改及数据的加载与查询等操作,同时还提供了通过Python脚本实现复杂数据处理的实际案例。

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

创建表

hive> CREATE TABLE pokes (foo INT, bar STRING); 

创建表并创建索引字段ds

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); 

显示所有表

hive> SHOW TABLES;

按正条件(正则表达式)显示表,

hive> SHOW TABLES '.*s';

表添加一列 

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一列并增加列字段注释

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

更改表名

hive> ALTER TABLE events RENAME TO 3koobecaf;

删除列

hive> DROP TABLE pokes;

元数据存储

将文件中的数据加载到表中

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes; 

加载本地数据,同时给定分区信息

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

加载DFS数据 ,同时给定分区信息

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous. 

SQL 操作

按先件查询

hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';

将查询数据输出至目录

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';

将查询结果输出至本地目录

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

选择所有列到本地目录 

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100; 

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

将一个表的统计结果插入另一个表中

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;

hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

JOIN

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

将多表数据插入到同一表中

FROM src

INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

将文件流直接插入文件

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples) 

实际示例

创建一个表

CREATE TABLE u_data (

userid INT,

movieid INT,

rating INT,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

STORED AS TEXTFILE;

下载示例数据文件,并解压缩

wget http://www.grouplens.org/system/files/ml-data.tar__0.gz

tar xvzf ml-data.tar__0.gz

加载数据到表中

LOAD DATA LOCAL INPATH 'ml-data/u.data'

OVERWRITE INTO TABLE u_data;

统计数据总量

SELECT COUNT(1) FROM u_data;

现在做一些复杂的数据分析

创建一个 weekday_mapper.py: 文件,作为数据按周进行分割 

import sys

import datetime

for line in sys.stdin:

line = line.strip()

userid, movieid, rating, unixtime = line.split('\t')

生成数据的周信息

weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

print '\t'.join([userid, movieid, rating, str(weekday)])

使用映射脚本

//创建表,按分割符分割行中的字段值

CREATE TABLE u_data_new (

userid INT,

movieid INT,

rating INT,

weekday INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t';

//将python文件加载到系统

add FILE weekday_mapper.py;

将数据按周进行分割

INSERT OVERWRITE TABLE u_data_new

SELECT

TRANSFORM (userid, movieid, rating, unixtime)

USING 'python weekday_mapper.py'

AS (userid, movieid, rating, weekday)

FROM u_data;

SELECT weekday, COUNT(1)

FROM u_data_new

GROUP BY weekday;

### Hive 集群巡检常用 SQL 命令 在维护和监控 Hive 集群的过程中,定期执行一些 SQL 巡检命令可以帮助发现潜在问题并确保集群的正常运行。以下是几个常用Hive 集群巡检 SQL 命令: #### 1. 检查表元数据状态 通过查询 `SYSTEM` 表或者 `INFORMATION_SCHEMA` 中的相关信息来确认表的状态是否正常。 ```sql SHOW TABLES; DESCRIBE FORMATTED table_name; -- 查看指定表的详细信息[^1] ``` #### 2. 统计分区数量 对于分区表来说,过多或过少的分区可能会影响性能。可以通过以下命令统计某个表中的分区总数: ```sql SHOW PARTITIONS table_name; SELECT COUNT(*) FROM (SHOW PARTITIONS table_name) t; -- 计算总分区数[^3] ``` #### 3. 查询未压缩的小文件情况 小文件问题是影响 HDFS 和 Hive 性能的重要因素之一。可以利用如下脚本来检测是否存在大量小文件: ```sql -- 替换 database_name 和 file_size_limit 参数以适应实际需求 SET hive.support.concurrency = false; WITH RECURSIVE cte AS ( SELECT db_name, tbl_name, concat_ws('/', location_root, dir_path) as full_path, CASE WHEN length(dir_path)=0 THEN location_root ELSE concat_ws('/',location_root,dir_path) END as abs_path, size_in_bytes FROM DBS JOIN TBLS USING(db_id) LEFT OUTER JOIN SDS ON(TBLS.sd_id=SDS.sd_id) CROSS JOIN SPLIT_PART(REVERSE(SUBSTRING_INDEX(REPLACE(location,'/',' '), ' ', LENGTH(location)-LENGTH(REPLACE(location,'/',' ')))), '/', -1) AS dirs(dir_path), LATERAL VIEW explode(split(reverse(substring_index(replace(location,'/',' '), ' ',length(location)-length(replace(location,'/',' ')))),'/')) exploded_table AS path_part WHERE dbs.db_name='database_name' UNION ALL SELECT db_name,tbl_name,concat(abs_path,'/',path_part),abs_path,size_in_bytes FROM cte JOIN SPLIT_PART(REVERSE(cte.full_path),'/',-1) AS parts(path_part) WHERE trim(parts.path_part)<>'') SELECT * FROM cte WHERE size_in_bytes < file_size_limit ORDER BY size_in_bytes ASC LIMIT 100; ``` 此复杂查询能够帮助识别存储中小于设定阈值的所有对象。 #### 4. 获取最近修改时间较久远的数据 长时间未更新的数据可能是冷数据或者是不再使用的废弃数据。下面这条语句可用于找出最后更改日期距离当前超过一定天数的所有记录: ```sql SELECT name, input_format, output_format, serde_lib, last_access_time FROM tables WHERE TBL_TYPE !='VIRTUAL_VIEW' AND DATEDIFF(CURRENT_DATE,last_access_time)>specified_days; ``` #### 5. 展示锁等待状况 如果某些操作因为其他事务持有锁定而被阻塞,则可能会降低整体效率。因此有必要监视这些情形的发生频率及其持续时长。 ```sql LOCK TABLE table_name EXCLUSIVE FOR read; SHOW LOCKS table_name EXTENDED; ``` 以上就是针对Hive集群的一些基本但重要的SQL巡检指令集合[^2]。它们有助于管理员更好地理解系统的健康程度以及及时采取措施解决可能出现的各种异常现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值