外部表分区添加数据方式代码示例

tips
1.
create external table ext_user(id int, mail String, count int) partitioned by (ds string) row format delimited fields terminated by '\t' stored as textfile location '/dsap/rawdata/user';  hdfs location 路径需为文件夹,或不存在(执行后会自动创建文件夹),另 date为保留关键字

2.
hadoop fs -put /work/user.txt /dsap/rawdata/user/20120412/user.txt
hadoop fs -put /work/user.txt /dsap/rawdata/user/20120413/user.txt

hadoop fs -ls /dsap/rawdata/user
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/20120412
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/20120413

3.
load data inpath '/dsap/rawdata/user/20120412' overwrite into table ext_user partition (ds='20120412');
load data inpath '/dsap/rawdata/user/20120413' overwrite into table ext_user partition (ds='20120413');


hadoop fs -ls /dsap/rawdata/user
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/ds=20120412
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/ds=20120413

alter table ext_user add partition (ds='20120411') location '/dsap/rawdata/user/20120411';

hadoop fs -ls /dsap/rawdata/user
drwxr-xr-x   - root supergroup          0 2012-04-13 17:06 /dsap/rawdata/user/20120411
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/ds=20120412
drwxr-xr-x   - root supergroup          0 2012-04-13 16:46 /dsap/rawdata/user/ds=20120413

4.
select count(*) from ext_user where ds='20120413';

5.
show partitions ext_user;




only test:

hadoop fs -put /work/user.txt /dsap/rawdata/user/20120415/user.txt
hadoop fs -put /work/user.txt /dsap/rawdata/user/20120416/user.txt
fs -ls
drwxr-xr-x   - root supergroup          0 2012-04-13 17:59 /dsap/rawdata/user/20120415
drwxr-xr-x   - root supergroup          0 2012-04-13 17:59 /dsap/rawdata/user/20120416

then
load data inpath '/dsap/rawdata/user/20120415' overwrite into table ext_user1 partition (ds='20120415');
fs -ls
drwxr-xr-x   - root supergroup          0 2012-04-13 18:02 /dsap/rawdata/user/20120416
drwxr-xr-x   - root supergroup          0 2012-04-13 17:59 /dsap/rawdata/user/ds=20120415   (20120415->ds=20120415)

do a tricky test:
load data inpath '/dsap/rawdata/user/ds=20120415' overwrite into table ext_user1 partition (ds='ds=20120415');
fs -ls
drwxr-xr-x   - root supergroup          0 2012-04-13 18:02 /dsap/rawdata/user/20120416
drwxr-xr-x   - root supergroup          0 2012-04-13 17:59 /dsap/rawdata/user/ds=ds%3D20120415 (ds=20120415->ds=ds%3D20120415)

hadoop fs -mv /dsap/rawdata/user/ds=ds%3D20120415 /dsap/rawdata/user/20120415
load data inpath '/dsap/rawdata/user/20120415' overwrite into table ext_user1 partition (ds='test');
drwxr-xr-x   - root supergroup          0 2012-04-13 17:59 /dsap/rawdata/user/ds=test
conclusion:  load data inpath 分区时候会使hdfs路径修改, mv 原路径 partition(分区=值)的形式

alter table ext_user1 add partition (ds=20120416) location '/dsap/rawdata/user/20120416';
drwxr-xr-x   - root supergroup          0 2012-04-13 18:02 /dsap/rawdata/user/20120416 路径不变
tricky one
hadoop fs -put /work/user.txt /dsap/rawdata/user/20120417/user.txt
alter table ext_user1 add partition (ds='ok') location '/dsap/rawdata/user/20120417';
drwxr-xr-x   - root supergroup          0 2012-04-13 18:19 /dsap/rawdata/user/20120417  路径不变

conclusion alter table add partition(分区=值) location ''; 不改变hdfs路径

### 如何设置定时任务以向 PostgreSQL 分区表插入数据 为了实现通过定时任务向 PostgreSQL 的分区表中插入数据,可以通过以下方法完成: #### 方法一:使用 `pg_cron` 扩展 PostgreSQL 提供了一个名为 `pg_cron` 的扩展工具,允许在数据库内部调度作业。以下是具体的步骤: 1. **安装并启用 `pg_cron` 扩展** 需要先确保服务器上已安装 `pg_cron` 并启用了该功能。 ```sql CREATE EXTENSION IF NOT EXISTS cron; ``` 2. **定义插入逻辑** 创建一个存储过程或 SQL 脚本,负责将新数据插入到分区表中。例如: ```sql CREATE OR REPLACE FUNCTION insert_into_partitioned_table() RETURNS void AS $$ BEGIN -- 假设有一个主表 orders 和基于日期的分区表 INSERT INTO orders (order_id, order_date, amount) SELECT generate_series(1, 10), current_date, round(random() * 100); END; $$ LANGUAGE plpgsql; ``` 3. **配置定时任务** 使用 `pg_cron` 安排上述函数按指定的时间间隔运行。例如,每小时执行一次: ```sql SELECT cron.schedule('0 * * * *', $$SELECT insert_into_partitioned_table();$$); ``` 此方法的优点在于无需依赖外部脚本或程序,完全由数据库管理。 --- #### 方法二:使用操作系统级的任务计划器(如 Linux Cron) 如果更倾向于使用操作系统的任务计划器,则可以按照如下方式进行设置: 1. **编写 SQL 插入脚本** 编写一个简单的 SQL 文件,其中包含插入数据的逻辑。例如: ```sql -- file: insert_data.sql \connect your_database_name; INSERT INTO orders (order_id, order_date, amount) SELECT generate_series(1, 10), current_date, round(random() * 100); ``` 2. **创建 Shell 脚本来调用 SQL 文件** 将 SQL 文件封装在一个可执行的 shell 脚本中: ```bash #!/bin/bash psql -U your_username -h localhost -f /path/to/insert_data.sql ``` 3. **安排 Cron 任务** 在 Linux 中编辑 crontab 文件,添加一条规则以定期运行脚本。例如,每天凌晨 3 点执行: ``` 0 3 * * * /path/to/run_insert_script.sh >> /var/log/cron.log 2>&1 ``` 这种方法适合需要跨多个环境部署的情况,并且能够利用现有的系统资源。 --- #### 方法三:结合 Spring Batch 或其他框架 对于 Java 应用场景下的项目,可以考虑使用 Spring Batch 来处理批量插入任务。Spring Data JPA 可以直接操作主表,而底层会自动路由至相应的分区表[^1]。 1. **定义批处理 Job** 利用 Spring Batch 创建一个 Job,其 Step 包含读取源数据和将其写入目标表的操作。 2. **调度 Job 运行** 结合 Quartz Scheduler 或 Spring Task 注解 (`@Scheduled`) 实现周期性触发。 示例代码片段: ```java @Component public class PartitionDataInserter { @Autowired private OrderRepository orderRepository; @Scheduled(cron = "0 */5 * * * ?") // 每隔五分钟执行一次 public void scheduleInsertTask() { List<Order> newOrders = generateNewOrders(); orderRepository.saveAll(newOrders); } private List<Order> generateNewOrders() { return IntStream.rangeClosed(1, 10) .mapToObj(i -> new Order(UUID.randomUUID(), LocalDate.now(), Math.random() * 100)) .collect(Collectors.toList()); } } ``` 这种方式特别适用于复杂的业务需求以及分布式架构中的应用层控制。 --- ### 注意事项 - 如果使用声明式分区表,需注意手动维护分区结构,即提前创建未来可能使用的分区表。 - 对于时间戳类型的字段,建议采用标准格式化方式提取年月日等信息以便更好地支持分区策略[^4]。 - 当涉及大量历史数据迁移时,应评估性能影响并采取分批次导入措施[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值