hive计划(二)分区

partition 相当于索引,避免全表扫描

使用外部表不会清除HDFS文件系统的数据

#使用hive -e 可以执行多条语句
hive -e 'sentence1; sentence2;'
#进入hive 后查看当前路径
!pwd;
#hive 界面使用命令查看hdfs路径
dfs -ls / ;
#使用desc可以查看表的信息
desc <table.name>
#查看分区表的分区信息
show partitions <table.name>

通过文件存储的位置来看分区:

一般分区信息不存在于load的表中
--分区表的创建
create database if not exists bikepatition
comment 'test database';
create table if not exists bikepatition.bike(
tripduration string, 
starttime string,
stoptime string,
start_station_id string,
start_station_name string,
start_station_latitude string,
start_station_longitude string,
end_station_id string,
end_station_name string,
end_station_latitude string,
end_station_longitude string,
bikeid string,
usertype string,
birth_year string,
gender string
)
--注意patition要放在ROW语句前面
--表示按照月份分区
partitioned by (time_month string,creator string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS  TEXTFILE;

载入数据

--使用load加载并表明partitioned信息
--两个分区的标签信息,就会产生两级的目录
--可以load不同的表到同一个表中,建立不同的分区
load data local inpath '<绝对路径>' into table <table_name> partition(time_month = <分区标签>,creator = 'eric');
alter table <table_name> add partition(time_month=<标签>,creator='eric') location '<本地文件路径>';
--删除分区
alter table <table_name> drop partition(time_month=<标签> ,creator='eric');
### 如何将Hive的一级分区转换为分区Hive中,一级分区分区的主要区别在于表结构的设计以及数据存储的方式。如果需要将现有的基于一级分区的表升级到分区,则涉及以下几个方面的工作:重新设计表结构、迁移现有数据并更新查询逻辑。 #### 1. 表结构调整 为了支持分区(或多级分区),需要修改原有的`CREATE TABLE`语句,在`PARTITIONED BY`子句中添加额外的分区字段。例如: ```sql -- 原有一级分区表 CREATE TABLE IF NOT EXISTS user_data ( id INT, name STRING, sex STRING, age INT ) PARTITIONED BY (year STRING); -- 修改后的分区表 CREATE TABLE IF NOT EXISTS user_data_partitioned ( id INT, name STRING, sex STRING, age INT ) PARTITIONED BY (year STRING, month STRING); ``` 此操作会创建一个新的带有分区的表[^2]。 --- #### 2. 数据迁移 由于新旧表的结构不同,因此需要手动完成数据迁移工作。以下是具体方法: ##### 使用INSERT INTO语句进行数据导入 可以通过SQL语句提取原表中的数据,并按照新的分区规则将其写入目标表。例如: ```sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE user_data_partitioned PARTITION(year, month) SELECT id, name, sex, age, year, substr(month_column, 1, 2) AS month -- 提取月份信息 FROM user_data; ``` 在此过程中需要注意以下几点: - **动态分区设置**:启用动态分区功能以简化多级分区的数据加载过程[^4]。 - **日期解析**:假设原始表中有单独的时间戳列或者能够推导出年份和月份的信息,需确保这些值被正确映射至对应的分区字段。 --- #### 3. 添加分区声明 对于已经存在的历史数据文件夹路径可能不符合新增加的层次化目录命名约定;此时可通过ALTER命令显式指定各层的具体位置关系: ```sql ALTER TABLE user_data_partitioned ADD PARTITION (year='2023', month='01') LOCATION '/path/to/existing/data/year=2023/month=01'; ``` 这一步骤允许保留原有物理存储布局的同时让元数据库识别它们属于哪个特定组合下的记录集合[^3]. --- #### 注意事项 - 在执行任何更改之前,请务必备份当前环境配置及相关重要资料以防万一发生不可逆错误. - 如果源端存在大量存量数据那么整个流程可能会耗费较长时间资源消耗较大建议安排于业务低谷期实施. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值